记录整理一些在阅读《征服C指针》过程中的感想。
1 关于数组和数组指针
char array1[2]; //定义一个数组,包含了2个char元素
char (*array2)[2]; //定义一个数组指针,这个指针指向的数组是一个包含了2个元素的数组
另外:
(1)数组名称array其实代表了数组首元素的地址,即&array[0],而&array代表的其实是整体数组地址。所以,array+1和&array+1所移动的距离是不一样的,前者是一个字节,后者是2个字节。
(2)看看这样的代码:
char array1[2];
char (*array2)[2];
array2 = array1; //错误,cannot convert from 'char [2]' to 'char (*)[2]'
ayyay2 = &array; //正确,为什么?&array代表了一个包含2个元素的数组,而array代表的是&array[0]。
array2 = new char[2]; //错误,cannot convert from 'char *' to 'char (*)[2]'。new返回的只是一个指针,而指针并不会包含区域大小信心,所以把它赋值给array2就会造成类型不匹配。
(3)array[i]其实是*(array+i)的语法糖。实际上[]和数组之间并不存在任何关系。
2 关于这样一个数组的一个声明:
char (*array[5])[2];
其实是定义了一个数组指针,这个指针指向一个数组,这个数组包含了5个元素,每个元素又是另一个2维数组。是不是很绕口?如果这样写就很明白了:
typedef char POINT[2]; //定义一个包含2个元素的数组的别名
POINT (*array)[5];//定义一个数组,包含了5个元素,每个元素的类型是什么?是POINT,POINT是什么?上面已经定义了!