C语言指针和数组的学习方法

2020-09-22 C语言

  C语言中的指针和数组一直是让自己觉得头疼的问题,最近好好研究了一下,将自己的体会写下来,当做总结吧。

C语言指针和数组的学习方法

  先说指针,首先指针是一个变量,但它存的是变量的地址,利用指针可以间接访问一个变量,比如下面这个例子:

  int a;

  int *p=&a;

  定义了一个整型变量a,定义了一个指向整型变量的指针变量p,这时候指针变量p里面存的就是整型变量a的地址。在后面要为a赋值的时候,比如赋值为10,可以这样写:a=10;也可以这样写:*p=10;这两个表达式都是等价的,也就是说,可以通过*这个符号,去访问某个地址的内容。我觉得之前看过的一个比喻非常好(具体出处忘了),说*这个符号就像一把钥匙,而指针变量就像一把锁,拿*这把钥匙把指针变量这把锁打开,然后就能往打开后的这个空间里面存放东西。我觉得指针这个东西很神奇,因为它能指向不同的变量,即不同的空间。

  再来说数组,数组最头疼的就是数组名,但数组名的定义已经很明确了,数组名是指向数组首元素的指针常量,这个定义简直就是一针见血,来看一些例子:

  1.

  int n[10] ;

  定义了一个有10个元素的整型数组n,那么根据定义,数组名n和&n[0]是等价的,如果我们这样操作:n+1,那么n+1就和&n[1]是等价的,因为这里的n是一个指向整型变量的指针常量,这里n的类型很重要。

  2.

  int n[10][10];

  定义了一个有100个元素的二维整型数组n,那么n是否和&n[0][0]是等价的呢?答案是否定的。当我们定义了n[10][10]这个二维数组时,编译器“咔嚓”、“咔嚓”将一段内存空间剪成10份,然后又“咔嚓”、“咔嚓”将每一份空间再剪成10份,然后便得到了100个最小空间为一个int型大小的'空间,那么n代表什么呢?数组名的定义:数组名是指向数组首元素的指针常量,这里n代表指向上面编译器第一次将内存“咔嚓”、“咔嚓”剪成10份的首元素(里面包含10个int型)的指针常量,这就是n的类型,很明显,n的类型不是一个指向int类型的指针变量,所以n和&n[0][0]并不等价。这时我们如果这样操作:n+1,那么n+1便指向了上面编译器“咔嚓”的第二段,写到这你会想,既然n和&n[0][0]并不等价,那么n和&n[0]是否等价呢?答案是对的。多维数组有个很特殊的地方,因为它还有这样的数组名:n[0],这个代表什么呢?答案就是n[0]才是和&n[0][0]等价的。所以最后得出的结论是:*n[0]代表n[0][0],*n代表n[0],**n代表n[0][0],这种感觉就像,没开锁的时候(n),在你面前放着的是整个大宝箱(整个数组n[10][10])里面的第一个大宝箱,里面装着10个小宝箱(n[0]),当你第一次把锁打开(*n),你面前放着的是10个小宝箱里面的第一个小宝箱,当然你也可以选择第二个(*n+1),你再一次把锁打开(**n),就能看见宝石啦!

  更多维的数组也可以这样分析。

  为了验证上面的说法,在C编译器里面输入下面的代码:

  #include "stdio.h"

  main()

  {

  int n[2][2] = {1, 2, 3, 4};

  printf("n[0][0] is %d ", n[0][0]);

  printf("*n[0] is %d ", *n[0]);

  printf("**n is %d ", **n);

  printf("*(*n+1) is %d ", *(*n+1));

  printf("**(n+1) is %d ", **(n+1));

  printf("n[0] is %d ", n[0]);

  printf("*n[0] is %d ", *n[0]);

  printf("n is %d ", n);

  printf("*n is %d ", *n);

  }

  运行结果是:

  运行结果和上面分析的一致。但,这里有个问题是,既然n[0]和n的结果是一样的,那为什么*n[0]和*n的结果不一样呢?原因是类型不一致,*n[0]直接就把小宝箱打开了,但*n才刚打开上一层呢。但C语言提供了穿越的方法,这样:*(int *)n,把n直接强制转换成一个指向int类型的指针,然后用*打开,便取得了宝石,太神奇了!

【C语言指针和数组的学习方法】相关文章:

C语言指针数组的概念10-22

C语言数组与指针详解11-05

C语言指针和数组基础知识10-04

C语言中指针与数组的区别10-05

C语言指针函数和函数指针详解06-10

C语言指针教学11-05

C语言中的指针和内存泄漏10-05

C语言指针的用法10-05

C语言指针的传递10-06

C/C++产生指定范围和不定范围随机数的实例代码 KMP算法的C#实现方法