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;