首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(arr + 2)等于*(arr + 2)。多么?

(arr + 2)等于*(arr + 2)。多么?
EN

Stack Overflow用户
提问于 2018-08-28 16:40:17
回答 3查看 2.7K关注 0票数 9

我正在学习如何用指针来显示二维数组的元素。下面是我尝试过的代码:

代码语言:javascript
复制
#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)); 
}

输出:

代码语言:javascript
复制
6487616
6487616

我期望*(arr + 2)的输出是3。怎么会和(arr + 2)一样

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-28 16:48:43

二维数组实际上是数组的数组。

表达式arr + 2的类型为int (*)[2],而*(arr + 2)的类型为int [2]。在打印前者时,您有一个指针,以便打印指针的值。在后一种情况下,您有一个指向指向第一个元素的指针的数组。因此,*(arr + 2)衰变为arr + 2,这与第一个表达式相同。

关于arr + 2的更多细节,arrint [3][2]类型。当向其添加整数值时,它会衰减到指向第一个成员的指针,因此arr会衰减为int (*)[2]类型,arr + 2也具有该类型,并指向包含{ 3, 4 }的子数组。

还请注意,指针应该用%p格式说明符打印,指针必须传递到void *,否则调用未定义行为。在这种情况下,你是“幸运的”,他们碰巧打印了同样的东西。

要获得预期的3的输出,您需要再取消一次引用:

代码语言:javascript
复制
*(*(arr + 2))
票数 14
EN

Stack Overflow用户

发布于 2018-08-28 16:54:07

arrint数组的数组。在几乎任何使用中,数组都被转换为指向其第一个元素的指针。因此,arr被转换为指向int数组的指针。

好的,arr被转换成指向int数组的指针,所以(arr+2)是同一类型的,也就是指向int数组的指针。

现在,*(arr+2)(arr+2)所指的东西。也就是说,一个int数组。

现在,由于它是一个int数组,所以它被转换为指向其第一个元素的指针。因此,*(arr+2)被转换为指向int的指针。注意,它不是int,不太可能等于3

现在,为什么(arr+2)*(arr+2)的剂量播放相同?它们是指向数组的指针和指向其第一个元素的指针。尽管这些切入点类型不同,但它们表示相同的地址,因为任何数组的地址都与其第一个元素的地址相同。

票数 3
EN

Stack Overflow用户

发布于 2018-08-28 17:00:33

arr是指向类型int[2]的第一个数组的指针,(arr + 2)是指向第三个这样的数组的指针。

*(arr + 2)是指向(arr +2)数组的第一个元素的指针。

因此,这两种类型的地址都是相同的,因为它们指向相同的position.The,只有它们的类型不同。(arr+2)int(*)[2]类型,而*(arr + 2)int *类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52062706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档