我正在学习如何用指针来显示二维数组的元素。下面是我尝试过的代码:
#include<stdio.h>
int main(){
int arr[3][2] = {
{7, 8},
{6,3},
{3,4}
};
printf("%u\n", (arr + 2));
printf("%u\n", *(arr + 2));
}输出:
6487616
6487616我期望*(arr + 2)的输出是3。怎么会和(arr + 2)一样
发布于 2018-08-28 16:48:43
二维数组实际上是数组的数组。
表达式arr + 2的类型为int (*)[2],而*(arr + 2)的类型为int [2]。在打印前者时,您有一个指针,以便打印指针的值。在后一种情况下,您有一个指向指向第一个元素的指针的数组。因此,*(arr + 2)衰变为arr + 2,这与第一个表达式相同。
关于arr + 2的更多细节,arr有int [3][2]类型。当向其添加整数值时,它会衰减到指向第一个成员的指针,因此arr会衰减为int (*)[2]类型,arr + 2也具有该类型,并指向包含{ 3, 4 }的子数组。
还请注意,指针应该用%p格式说明符打印,指针必须传递到void *,否则调用未定义行为。在这种情况下,你是“幸运的”,他们碰巧打印了同样的东西。
要获得预期的3的输出,您需要再取消一次引用:
*(*(arr + 2))发布于 2018-08-28 16:54:07
arr是int数组的数组。在几乎任何使用中,数组都被转换为指向其第一个元素的指针。因此,arr被转换为指向int数组的指针。
好的,arr被转换成指向int数组的指针,所以(arr+2)是同一类型的,也就是指向int数组的指针。
现在,*(arr+2)是(arr+2)所指的东西。也就是说,一个int数组。
现在,由于它是一个int数组,所以它被转换为指向其第一个元素的指针。因此,*(arr+2)被转换为指向int的指针。注意,它不是int,不太可能等于3。
现在,为什么(arr+2)和*(arr+2)的剂量播放相同?它们是指向数组的指针和指向其第一个元素的指针。尽管这些切入点类型不同,但它们表示相同的地址,因为任何数组的地址都与其第一个元素的地址相同。
发布于 2018-08-28 17:00:33
arr是指向类型int[2]的第一个数组的指针,(arr + 2)是指向第三个这样的数组的指针。
而*(arr + 2)是指向(arr +2)数组的第一个元素的指针。
因此,这两种类型的地址都是相同的,因为它们指向相同的position.The,只有它们的类型不同。(arr+2)是int(*)[2]类型,而*(arr + 2)是int *类型。
https://stackoverflow.com/questions/52062706
复制相似问题