C 为什么这个声明不起作用
在C 为什么这个声明不起作用,c,pointers,C,Pointers,在int(*x)[10]中x是指向10ints数组的指针 那么,为什么这段代码不编译: int arr[3] ; int (*p)[3] =arr; 但这是可行的: int arr[3]; int (*p)[3] =&arr; arr是一个计算结果为int*的表达式(这是著名的“数组衰减到指针”功能) &arr是一个计算结果为int(*)[3]的表达式 数组名称“衰减”到指向所有表达式中数组第一个元素的指针,除非它们是sizeof或&运算符的操作数。对于这两个操作,数组名称保留
int(*x)[10]中
x
是指向10int
s数组的指针
那么,为什么这段代码不编译:
int arr[3] ;
int (*p)[3] =arr;
但这是可行的:
int arr[3];
int (*p)[3] =&arr;
arr
是一个计算结果为int*
的表达式(这是著名的“数组衰减到指针”功能)
&arr
是一个计算结果为int(*)[3]
的表达式
数组名称“衰减”到指向所有表达式中数组第一个元素的指针,除非它们是
sizeof
或&
运算符的操作数。对于这两个操作,数组名称保留其“Arraynes”(C99 6.3.2.1/3“左值、数组和函数指示符”)。其工作原理与以下原因不完全相同:
int i;
int* pi = i; // error: no conversion from int to int*
+1:我还要指出,尽管类型不同,但两个表达式返回相同的指针地址。