gpt4 book ai didi

c - 3d 数组在引用两次后打印地址?

转载 作者:行者123 更新时间:2023-11-30 15:29:51 25 4
gpt4 key购买 nike

为什么 3D 数组在取消引用两次后会打印地址?请帮助我理解下面发布的代码(假设数组从位置 1002 开始)。

int main()
{
int a[2][3][4]={
{
1,2,3,4,
4,5,6,7,
9,1,1,2
},
{
2,1,4,7,
6,7,8,9,
0,0,0,0
}
};

printf("%u %u %u %u\n",a,*a,**a,***a); //a == *a == **a, all print address 1002. Why?

}

最佳答案

**a 的类型为 int * 并指向 3D 数组中的第一个 int
*a 的类型为 int (*)[4] 并指向 3D 数组的第一行
a 的类型为 int (*)[3][4] 并指向 3D 数组中的第一个 2D 数组
&a 的类型为 int (*)[2][3][4] 并指向整个 3D 数组

所以它们都是指向同一个地址的指针。只是指针的类型不同。下面的代码可能有助于说明这一点。

int main( void )
{
int a[2][3][4]={ 1,2,3,4, 4,5,6,7, 9,1,1,2, 2,1,4,7, 6,7,8,9, 0,0,0,0 };

int *ptrInt; // pointer to an int
int (*ptrArray1)[4]; // pointer to an array of ints
int (*ptrArray2)[3][4]; // pointer to a 2D array of ints
int (*ptrArray3)[2][3][4]; // pointer to a 3D array of ints

ptrInt = **a;
ptrArray1 = *a;
ptrArray2 = a;
ptrArray3 = &a;

printf( "%p %p\n", ptrInt , ptrInt + 1 );
printf( "%p %p\n", ptrArray1, ptrArray1 + 1 );
printf( "%p %p\n", ptrArray2, ptrArray2 + 1 );
printf( "%p %p\n", ptrArray3, ptrArray3 + 1 );
}

注意:我在数组初始化中省略了内部大括号,专门是为了证明内部大括号是可选的。最佳实践是使用所有内部大括号。

此代码的典型输出如下所示。我添加了注释以将两个指针之间的差异显示为十进制数。

0x17b00 0x17b04  //  4 bytes, hence pointer to an int
0x17b00 0x17b10 // 16 bytes, pointer to int[4]
0x17b00 0x17b30 // 48 bytes, pointer to int[3][4]
0x17b00 0x17b60 // 96 bytes, pointer to int[2][3][4]

请注意,当您将任何指针加 1 时,该对象的大小也会添加到该指针上。例如,如果您有一个 int * 并将 1 添加到该指针,则该指针的值将增加 4,因为 sizeof(int) == 4. (是的,假设整数是 32 位,谢谢。)

所以通过给指针加1,就可以确定指针所指向的对象的大小。从编译器的角度来看,这为您提供了有关指针类型的线索。在上面的示例中,请注意,向 ptrArray1 添加 1 会将指针更改为 16。这是因为 ptrArray1 指向一个大小为 16 的对象,具体来说,它指向一个大小为 4 的数组整数。

<小时/>

为了让大家完全困惑,请允许我说下面的代码行将打印数字 8。我选择了 8,因为它在数组中只出现一次,因此您可以知道它来自哪里。

    printf( "%d\n", ptrArray3[0][1][1][2]);

请注意,我似乎正在使用 ptrArray3 作为 4 维数组。这就是为什么指向多维数组的指针在 C 中如此令人困惑。当将数组转换为指针时,指针的维度比数组少一维。但是,当您使用带有数组语法的指针时,您使用它就好像它多了一个维度。

例如,从二维数组开始

int array[4][100];

对应的指针是指向一维数组的指针

int (*ptr)[100] = array;

但是您可以像二维数组一样使用该指针

ptr[2][100] = 6;

这是所有困惑的基础,也是 C 语言中很少使用指向数组的功能的原因。

关于c - 3d 数组在引用两次后打印地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26000609/

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