看了文章:http://blog.csdn.net/porscheyin/article/details/3461565
归纳总结一下:
(1) 可以将一个T类型数组的名字赋给一个相同类型的指针。 当有语句char ary[100] = {'a', 'b', 'c', 'd','e', 'f'}; char *cp = ary; 后,cp就指向了数组array中的第一个元素。我们可以通过指针来访问数组的元素:printf("%d", *cp); 此语句的作用是打印出cp所指向的元素的值,也就是数组的第一个元素。现在通过cp = &array[3]; 使cp指向数组中的第4个元素,然后我们就可以对它进行各种操作了。
(2) 当我们声明一个数组时,编译器将根据声明所指定的元素数量及类型为数组保留内存空间,然后再创建数组名,编译器会产生一个符号表,记录数组名和数组的第一个元素的首地址。数组的属性和指针的属性不相同,在声明数组时,同时分配了用于容纳数组元素的空间;而声明一个指针时,只分配了用于容纳指针本身的空间。
(3) 针进行减法得到的结果指示出两指针所指向元素间的距离,即它们之间相隔几个数组元素。注意:ANSI C标准没有定义两个指针相加的运算,如果两个指针相加,绝大多数编译器会在编译期报错。
(4)数组名是一个指针常量,即指针自身的值不能被改变。如ia[100], ia + 99是可以的,但ia++是不行的,它的意思是ia = ia +1; 修改了ia的值。
(5)作为函数参数时, 不管下面哪种声明方式,都会被转换成指针,即ia不再是指针常量了,可以++。
void array_to_pointer(int *ia){……} //无需转换
void array_to_pointer(int ia[ ]){……} //被转换成*ia
void array_to_pointer(int ia[100 ]){……} //被转换成*ia, sizeof(ia) = 4 (int指针, 4字节)
因此,编译器始终形参把它当作一个指向数组第一个元素(数组长度未知)的指针。使用sizeof(形参数组名)来获得数组的长度时,得到的只是一个指针的大小。
(6) 二维数组:
matrix[50][100]
int (*p) [100] = matrix; 此时的matrix被转换为一个指向数组的指针,对于matrix[n],是matrix数组的第n+1个元素的名字,也就是matrix数组中50个有着100个整型元素的数组之一,所以可以有p = &matrix[n]; 即p指向了一个数组元素,也就是矩阵中的某一行,matrix[n]本身是一个一维数组的数组名,它会被转换为指向数组第一个元素的指针,因此可以有int *column_p = matrix[n];这个表达式是最常见的也最容易理解。如果对matrix[n]进行sizeof 操作结果是100*sizeof(int); 而sizeof(matrix)结果是50*100*sizeof (int)。
(7) 指针数组:
所谓指针数组就是一个数组它的所有元素都是指针,这与普通的数组没什么区别,不过元素是指针罢了。int (*p) [100]; 如果丢掉了括号那就完全改变了意图,从而声明了一个指针数组。
int *p[100]; p是一个数组名,该数组存放一个int型的指针。