最近一直迷惑于c数组与指针的关系,也参考了一些数据,比如说《c陷阱与缺陷之类》,书中原理讲的比较清楚,但总是感觉缺乏感性认识,于是自己写了一段最简单的代码来帮助自己理清楚数组与指针的关系(确切的说数组与指针本就不是同一事物,其没有本质关系)。
下面先让我们来看这段代码:
# include <stdio.h>
# include <stdlib.h>
int main(int argc, char **argv)
{
int array[10];
printf("the array is %p/n", array);
printf("the array+1 is %p/n", array+1);
printf("the &array[0] is %p/n", &array[0]);
printf("the &array[0] + 1 is %p/n", &array[0]+1);
printf("the &array is %p/n", &array);
printf("the &array + 1 is %p/n", &array+1);
return 0;
}
在linux下编译:gcc pointer.c
运行输出:
the array is 0x7fffb49a0320
the array+1 is 0x7fffb49a0324
the &array[0] is 0x7fffb49a0320
the &array[0] + 1 is 0x7fffb49a0324
the &array is 0x7fffb49a0320
the &array + 1 is 0x7fffb49a0348
从上面的例子我们可以清楚到看到,array和array[0]的地址相同,都是数组元素的首地址,而且array+1和&array[0]+1也相同,这就说明,array表示数组元素的首地址,并且&array[i]和(array+i)表示的意义相同,都表示数组第i个元素的地址。
然后我们再来看&array,显然其值array相同,但是其意义并不相同,我们从&array+1可以看出,其地址比array多出0x28,也就是十进制值40,即10个指针所占的空间,而我们的数组大小正好为10,这就表明,&array+1指向的是数组之后的地址。也就是说,&array表示的是整个数组首地址,也可以理解为其指向的是有十个整数的数组。通俗的将,就是指向数组的指针。
下面我们在来看看二维数组:
1 # include <stdio.h>
2 # include <stdlib.h>
3
4 int main(int argc, char **argv)
5 {
6 int array[10][2];
7 printf("the array is %p/n", array);
8 printf("the array+1 is %p/n", array+1);
9 printf("the &array[0] is %p/n", &array[0]);
10 printf("the &array[0] + 1 is %p/n", &array[0]+1);
11 printf("the &array is %p/n", &array);
12 printf("the &array + 1 is %p/n", &array+1);
13 printf("the array[0] is %p/n", array[0]);
14 printf("the array[0] + 1 is %p/n", array[0]+1);
15 printf("the &array[0][0] is %p/n", &array[0][0]);
16 printf("the &array[0][0] + 1 is %p/n", &array[0][0]+1);
17 return 0;
18 }
编译运行:
the array is 0x7fff1d53be90
the array+1 is 0x7fff1d53be98
the &array[0] is 0x7fff1d53be90
the &array[0] + 1 is 0x7fff1d53be98
the &array is 0x7fff1d53be90
the &array + 1 is 0x7fff1d53bee0
the array[0] is 0x7fff1d53be90
the array[0] + 1 is 0x7fff1d53be94
the &array[0][0] is 0x7fff1d53be90
the &array[0][0] + 1 is 0x7fff1d53be94
通过这个例子我们就能更好的理清楚二维指针的含义,并能较好的理解更高维指针,同时达到掌握一维指针的目的。
我们可以类比一维数组。那么,array是数组名代表数组首元素的地址,而二维数组的每个元素都是一个一维数组(数组的数组),所以我们的例子中数组首元素是一个有两个元素的数组,而array是这个两个元素的数组的地址,所以array+1相应的值增加8(两个元素)。同样的,array[0]也是表示数组的首元素,可以把array[0]看做一个数组,而array[0]就是这个数组的名字,那么类比一维数组,我们可以知道array[0]表示这个数组的首元素的地址,而array[0]+1,表示下一元素的地址。同理,&array[0]表示整个一维数组的地址,所以&array[0]+1相应的值增加8.
通过例子和类比,我们就可以很好的理解数组和指针了,在学习过程中遇到问题还是要多思考多实践来解决问题,这样才能不断地成长。