规则1 : 表达式中的数组名(和声明不同)被编译器当作是一个指向该数组第一个元素的指针,但是有例外:
a,数组作为sizeof()的操作数时,注意,sizeof()并不是函数,而是宏;
b,使用&操作数取数组的地址,例如:当定义一个数组指针时;
c,数组是一个字符串常量初始值,注意是个常量。
规则2 : 下标总是与指针的偏移量相同。
规则3 : 在函数参数的声明中,数组名被编译器当作指向该数组第一个元素的指针。
再说说个人堆二维数组和数组指针的理解:
- int arr[10] = {0};
-
int *p;
-
p = arr;
以上代码无疑是正确的,p为一个指向int类型数据的指针,而arr表示指向数组第一个元素(int类型)的指针,所以,两者是相容的。
- int arr[10] = {0};
-
int (*p)[10];
-
p = arr; //error
-
p = &arr; //ok
此时,p为一个指针,指向一个int类型的数组,&arr也是一个指向int类型的数组。
- int arr[3][10] = {0};
-
int *p;
-
int (*pp)[10];
-
p = arr[0];
-
p = &arr[0][0];
-
-
pp = arr;
-
pp = &arr[0];
pp指向的数组,该数组有3个元素,每个元素里面有10个 int型数据,arr[0]指向的数组,包含10个int型数据。所以,如果pp = arr[0]是不对的
阅读(1332) | 评论(0) | 转发(0) |