gpt4 book ai didi

c - C中一维和二维数组的区别

转载 作者:太空宇宙 更新时间:2023-11-04 02:51:17 25 4
gpt4 key购买 nike

 int arr[3][2]={{1,2},{3,4},{5,6}};
int *c=&arr;
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
printf("\n %d %d",((arr+i)+j),*(*(arr+i)+j));
}
}
for(i=0;i<6;i++)
{
printf("\n%d",(c++));
}

output:
2293536 1
2293536 2
2293552 3
2293552 4
2293568 5
2293568 6

2293536
2293540
2293544
2293548
2293552

我无法理解:为什么一维数组与二维数组不同?两者都像线性数组一样存储。 arr[1][0](arr+0)+1 不同。为什么 arr 中的地址不同?

最佳答案

arr[1][0](arr+0)+1 不同 - 它从来不应该是。 arr[1][0] 等同于 *(*(arr+1)+0),或者,如果你指的是地址,那么 &arr[ 1][0]*(arr+1)+0 相同。

因此,您的 printf 是错误的:

printf("\n %d %d",((arr+i)+j),*(*(arr+i)+j));

请记住,因为 arr 是一个 3 x 2 数组,所以 arr+x2*sizeof(int) 字节。因此,您打印的地址与您取消引用的地址不匹配。 arr+i+j不是*(*(arr+i)+j)的地址。

如果你想打印地址后跟里面的内容,你应该使用这个:

printf("\n %p %d", (void *) *(arr+i)+j,*(*(arr+i)+j));

注意格式说明符 %p。它必须是*(arr+i)+j,而不是(arr+i)+j,因为*(arr+i)int * 类型 - 它是指向 arr[i] 中第一个元素的指针。

您的第二个 printf 调用:

printf("\n %d %d",(c++));

无效:您指定了两个格式说明符,但只提供了一个。

关于c - C中一维和二维数组的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21953952/

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