Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Arrays_Pointers - Fatal编程技术网

C 使用给出错误的指针访问二维数组

C 使用给出错误的指针访问二维数组,c,arrays,pointers,C,Arrays,Pointers,我不明白为什么最后一个给了我一个错误,而之前的一个是好的。 p等于arr,那么它为什么不工作呢?arr在表达式*(*(arr+1)+3)=15中的类型为int(*)[4]和*(arr+1),因此可以对其应用解引用运算符。而另一方面,p属于int*类型*(p+1)的类型为int,不能对其应用解引用运算符。表达式中的数组被转换为指向其第一个元素的指针 因此,表达式(在子表达式arr+1)*(*(arr+1)+3)中的数组arr被转换为int(*)[4]类型的指针。反过来,子表达式arr+1也具有相同

我不明白为什么最后一个给了我一个错误,而之前的一个是好的。
p
等于
arr
,那么它为什么不工作呢?

arr
在表达式
*(*(arr+1)+3)=15中的类型为
int(*)[4]
int*
(数组到指针转换后)的code>和
*(arr+1)
,因此可以对其应用解引用运算符。而另一方面,
p
属于
int*
类型
*(p+1)
的类型为
int
,不能对其应用解引用运算符。

表达式中的数组被转换为指向其第一个元素的指针

因此,表达式(在子表达式
arr+1
*(*(arr+1)+3)中的数组
arr
被转换为
int(*)[4]
类型的指针。反过来,子表达式
arr+1
也具有相同的类型。子表达式
*(arr+1)
生成类型为
int[4]
的对象,该对象依次转换为指向其第一个元素的指针,并具有类型为
int*
。所以你可以像这样取消引用这个指针

Int arr[2][4], *p; p = &arr[0][0]; 
*(p + 2) = 10; //ok 
*(p + 5) = 20;// ok 
*(*(arr + 1) + 3) = 15;//ok 
*(*(p + 1) + 3) = 15;// error
指针
p
的类型为
int*
,因此此子表达式
*(p+1)
的类型为
int
,可能无法进一步取消引用

将这些语句一个接一个地写下来进行比较

*(*(arr + 1) + 3) = 15;//ok 

从第一条语句可以看出,
*(p+2)
的类型为
int
。因此,取消引用同样具有类型
int

的表达式
*(p+1)+3
*(p+1)
的类型是
int
,而不是指针,这是没有男性意义的。因此,
*(p+1)+3
不能取消引用。作为多维数组,
arr
是数组的数组。当它衰减为指向其第一个元素的指针时,该指针就是指向数组的指针(
Int(*)[4]
)。如果取消对这样一个指针的引用,则会得到一个数组,该数组本身会衰减为指针,在本例中为
Int
。另一方面,变量
p
是指向
Int
的指针。您可以取消对它的引用以获得
Int
,但不能进一步取消对该结果的引用,因为它不是指针。
  *(p + 2) = 10;  
*(*(p + 1) + 3) = 15;