gpt4 book ai didi

c - 为什么这个程序中的arr与*arr相同?

转载 作者:行者123 更新时间:2023-11-30 21:13:42 28 4
gpt4 key购买 nike

#include <stdio.h>

int main(void){
int arr[][2] = {1,2,3,4};
printf("0x%p\n", arr);
printf("0x%p\n", *arr);
return 0;
}

Code and running result

最佳答案

数组衰减为指向其第一个元素的指针

所以当你打印arr时真的是&arr[0] .

当你打印*arr时真的是&arr[0][0] .

两者都从同一位置开始。

如果我们看看数组在内存中的情况,就很容易看出:

+-----------+-----------+-----------+-----------+| arr[0][0] | arr[0][1] | arr[1][0] | arr[1][1] |+-----------+-----------+-----------+-----------+^|&arr[0][0]|&arr[0]|&arr

不同指针之间的最大区别不是它们的位置,而是它们的类型:&arr[0][0]类型为int * ; &arr[0]类型为int (*)[2] ;和&arr类型为int (*)[2][2] .

<小时/>

在处理这些事情时,了解任何数组或指针 a 也会有所帮助。和索引i ,表达式a[i] 完全等于 *(a + i) .

有了这些知识,如果我们采取例如&arr[0]它等于&(*(arr + 0)) 。等于 &(*arr)等于 arr (因为取址运算符 & 和解引用运算符 * 相互抵消)。

<小时/>

如上所述arr[0]也等于0[arr] 。这也来自arr[i]*(arr + i)等价。

因为 commutative property另外,表达式 *(arr + i)等于*(i + arr) ,然后得出奇数 i[arr]语法。

这是一种好奇心,不应该在“真实”代码中完成。

关于c - 为什么这个程序中的arr与*arr相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53265856/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com