Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C/C++;指向一维数组变量的指针_C++_C_Arrays_Pointers - Fatal编程技术网

C++ C/C++;指向一维数组变量的指针

C++ C/C++;指向一维数组变量的指针,c++,c,arrays,pointers,C++,C,Arrays,Pointers,考虑以下代码段: int x[] ={10,20,30,40,50}; int *p; int **q; p = x; /* Obviously p now holds base address of array. So no problem here */ q = &x; /* Error. Why? */ 我在gcc编译器中遇到这个错误 error: cannot convert ‘int (*)[5]’ to ‘int**’ in assignment q = &a

考虑以下代码段:

int x[] ={10,20,30,40,50};
int *p;
int **q;

p = x;    /* Obviously p now holds base address of array. So no problem here */ 
q = &x;   /* Error. Why? */
我在gcc编译器中遇到这个错误

error: cannot convert ‘int (*)[5]’ to ‘int**’ in assignment q = &x; 

数组变量可视为指向数组第一个元素的常量指针。那么为什么我不能将常量指针的地址(即)x分配给指针变量q的指针?

数组在某些上下文中衰减为指针,例如分配,或将其传递给函数

运算符
的地址不会将数组衰减为指针。就这么简单。相反,您会得到一个指向数组的指针。在这种情况下:

int (*q)[5];

q= &x;  // Works just fine

因为
&x
的类型是
int(*)[5]
,而不是
int**
——就像错误消息所说的那样。从拼写中可以看出,它们的类型完全不同。试图将该值视为指针数组会导致可怕的问题,因为它不是指针数组。@JonathanLeffler,但编译器允许从
int[]
赋值到
int*
,那么有什么区别呢?我会反复说:数组不是指针,指针不是数组。cc@lxopThe
&
是区别。你认为还有什么可能是造成麻烦的原因?@JonathanLeffler那么我如何分配&xIs值得注意的是,你可以使用
q[0][3]=41
(*q)[2]=31
增加数组中的值40和30(或者更准确地说,重新分配值,使其比以前的值大一倍,但是没有看到正式的增量,尽管
q[0][1]++
可以正常工作,当然是一个增量。