我的老师让我找出区别。有人可以帮我吗?实际上我知道第一部分是指针数组,但第二部分是什么意思。两者都不相同,因为我为此尝试了一个代码:
i = 1;
j = 2;
x[0] = &i;
x[1] = &j;
收到错误提示“需要左值”
如有疑问,请咨询cdecl:
int (*x)[]
declare x as pointer to array of int
int *x[]
declare x as array of pointer to int
int *x[3];
这x
是一个由 3 个指针组成的数组int
。
int (*x)[3];
这是一个指向三个sx
数组的指针。int
这是两者的使用示例:
int* arrayOfPointers[3];
int x, y, z;
arrayOfPointers[0] = &x;
arrayOfPointers[1] = &y;
arrayOfPointers[2] = &z;
int (*pointerToArray)[3];
int array[3];
pointerToArray = &array;
高温高压
从变量名“x”附近开始并以类型结束,记住Operator Precedence。意思是,() 和 [] 中 * 之前的任何内容。
x[] -- x is an array
*x[] -- x is an array of pointers
int *x[] -- x is an array of pointers to ints
(*x) -- x is a pointer
(*x) [] -- x is a pointer to an array
int (*x)[] -- x is a pointer to an array of type int
首先,请记住 C 声明反映了表达式的类型(即,声明模仿使用)。
例如,如果您有一个指向整数的指针,并且想要访问所指向的整数值,则可以使用一元运算符取消对指针的引用*
,如下所示:
int x = *p;
表达式 的类型*p
是int
,所以指针的声明p
是
int *p;
int
现在假设您有一个指向;的指针数组。要访问任何特定的整数值,您可以在数组中下标以找到正确的指针并取消引用结果:
int x = *a_of_p[i];
下标运算符[]
的优先级高于一元运算*
符,因此表达式*a_of_p[i]
被解析为*(a_of_p[i])
; 我们正在取消引用表达式的结果a_of_p[i]
。由于表达式 *a_of_p[i]
的类型是int
,所以数组的声明是
int *a_of_p[N];
现在翻转它;而不是指向 的指针数组int
,您有一个指向 的数组的指针int
。要访问特定的整数值,您必须首先取消引用指针,然后为结果下标:
int x = (*p_to_a)[i];
由于[]
优先级高于*
,我们必须使用括号来强制对运算符进行分组,以便将下标应用于表达式的结果*p_to_a
。由于表达式的类型(*p_to_a)[i]
是int
,因此声明是
int (*p_to_a)[N];
当你看到一个看起来有点毛茸茸的声明时,从最左边的标识符开始,然后走出来,记住这一点,[]
并且()
具有比 更高的优先级*
,指针数组也是如此,是指向*a[]
数组的指针,(*a)[]
是*f()
返回指针的函数,(*f)()
是指向函数的指针:
x -- x
(*x) -- is a pointer
(*x)[N] -- to an N-element array
int (*x)[N] -- of int
x -- x
x[N] -- is an N-element array
*x[N] -- of pointer
int *x[N]; -- to int.
int(*x)[ARRAY_SIZE]
解释为指向整数数组的指针。