gpt4 book ai didi

c - C数组的打印地址

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

下面的问题对社区来说可能听起来很重复,但有时您需要在脑海中提出确切的问题才能正确理解事物。我试图彻底了解指针。当演示者说使用 &pointername[subscript] 打印数组的每个元素的地址时,我正在看一个视频。我的问题是为什么不只是指针。在执行 j++ 后的下面代码中,J 不会有数组元素的地址吗?为什么要使用 &j[k]? &j[k],j(if theres)有什么区别

#include <stdio.h>

void main()
{
int i[] = {1, 2, 3, 4, 5}, *j, k;
j = i;
for (k = 0; k < 5; k++)
{
printf("%p, %p, %p\n", &j[k], j, i);
j++;
}
}

谢谢,

萨哈纳

最佳答案

在大多数情况下,当您在 C 中引用数组时,您自动获得的是指向数组第一个元素的指针。换句话说,当你写

j = i;

完全就像你写的一样

j = &i[0];

这进一步意味着当你写

i[k]

它完全等同于

*(i + k)

这意味着

&i[k]

永远等于

i + k            /* or &i[0] + k */

在您的程序中,j[k] 等于 *(j + k) 也是正确的,这意味着 &j[k] 等于 j + k

看起来您的程序正在尝试证明这些等价性,但它令人困惑,因为您同时递增 j 索引 j k。这是您的程序的一个版本,应该可以更清楚地说明发生了什么。 (除其他事项外,我已将数组的名称更改为 a,因为“i”是一个非常令人困惑的数组名称!同样,我已更改 jp。)

int main()
{
int a[] = {11, 22, 33, 44, 55}, *p, k;
printf("a = %p\n", a);
p = a;
for(k=0; k<5; k++)
{
printf("%d %p %p %d %d\n", k, &a[k], p, a[k], *p);
p++;
}
}

关于c - C数组的打印地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31500086/

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