gpt4 book ai didi

c - 数组元素打印的地址是什么?

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


更新:已报告此问题可能重复。同时将答案提交给that question部分解决了这个,解释一下why we can't use double pointers to represent two dimensional arrays ,它没有指定如何访问存储在指针中的值的正确内存地址;这是这个问题的主要主题。 future 中对任何感到困惑的人来说,这个问题中的明显答案很好地澄清了为什么这是一个被误解的概念以及如何解决它的替代方法.这可能对 future 想要跟踪输出以更好地理解概念的读者有用!(如果你仔细查看 comments by the OP in that question ,你会发现跟踪不够清晰,他无法理解。A 该问题的部分此处提供了一个更好的跟踪示例,因此几乎任何人都可以轻松理解)

(问题的其余部分是未经编辑的荣耀,供 future 的读者反射(reflection),如果他们碰巧犯了类似的错误。)


我想做什么:

  • 尝试了解如何使用指针而不是二维数组
  • 在本例中,我将值插入二维数组(即 a[ ][ ])
  • 我正在尝试使用指针(即 ptr)访问该数组中的值
  • 我也在尝试跟踪从中获取这些值的内存地址
  • 试图知道哪里出了问题?(希望得到适当的解释,如果可能的话,提供引用和进一步学习的链接)

我尝试过的:
下面是一个示例代码:

int main()
{
int a[2][2]={{5,7},
{0,1}};
int** ptr=(int**)a;
int i,j;
for(i=0;i<2;i++){
for(j=0;j<2;j++){
printf("%d printing from==>%x\n",&ptr[i][j],((&ptr[i])+j));
}
}
getch();
return(0);
}

在上面的代码中,我尝试在指针 ptr 的帮助下打印矩阵 a[ ][ ] 中存在的值。这样做时,我正在跟踪实际发生打印的地址(在内存地址中)。我似乎遇到了以下形式的灾难性输出:

5 printing from ==>12ff7c
9 printing from ==>12ff80
7 printing from ==>12ff80
11 printing from ==>12ff84

然后我修改了这一行:

printf("%d printing from==>%x\n",&ptr[i][j],((&ptr[i])+j));

用这个:

printf("%d printing from==>%d\n",&ptr[i][j],*((&ptr[i])+j));

要知道哪些值实际上出现在这些地址中:

5 printing from ==>5
9 printing from ==>7
7 printing from ==>7
11 printing from ==>0

我对此的看法是: &ptr[i][j] 等同于 (*(&ptr[i])+j))并且 ((&ptr[i])+j)) 并没有真正告诉我这些数字的地址,因为 &ptr[i] 定义了一个在这种情况下增加 j 的地址(但是因为 j 在每个外循环迭代;这将导致相同的内存地址被指向两次)我的这个思路错了吗?

你能帮我什么忙?

  • Here is my code惨败,基于我阅读的关于C 中的双指针和二维数组 的文章 here .我是否从根本上误解了它?
  • 您能否通过修改我给定的代码来发布正确的 cpp 代码 here并在评论中发布您自己的永久链接?(您可以通过单击该网站编码区域下方的“获取 URL”按钮来实现)
  • 我非常感谢基于 C 而不是 C++ 的答案,其中 typedef ans 是可能的我正在尝试更好地学习指针

最佳答案

二维数组和指向指针的指针是不同的动物!

一个二维数组,比如 int arr[N][M],是一个包含 N*M 个连续元素的数组,具有以下关系 &arr[i][j] == &arr [0][0] + i * M + j.

指针的指针是指向指针数组的指针,每个指针都指向另一个数组。

那你能做什么呢?

  • 将数组作为具有显式索引的一维数组处理

    int main()
    {
    int a[2][2]={{5,7},
    {0,1}};
    int* ptr=a[0]; // a[0] decays to a pointer...
    int i,j;
    for(i=0;i<2;i++){
    for(j=0;j<2;j++){
    printf("%d printing from==>%x\n",ptr[j + 2 *i],ptr + j + 2 * i);
    }
    }
    //getch();
    return(0);
    }
  • 显式创建一个指针数组

    int main()
    {
    int a[2][2]={{5,7},
    {0,1}};
    int *b[] = { a[0], a[1] }; // array of pointers pointing to beginning or rows
    int** ptr=b; // b decays to a pointer to pointer
    int i,j;
    for(i=0;i<2;i++){
    for(j=0;j<2;j++){
    printf("%d printing from==>%x\n",ptr[i][j],&(ptr[i][j]));
    }
    }
    //getch();
    return(0);
    }
  • 明确使用指向确定大小数组的指针:

    int main()
    {
    int a[2][2]={{5,7},
    {0,1}};
    int (*ptr)[2] = a; // a decays to a pointer arrays of size 2
    int i,j;
    for(i=0;i<2;i++){
    for(j=0;j<2;j++){
    printf("%d printing from==>%x\n",ptr[i][j],&(ptr[i][j]));
    }
    }
    //getch();
    return(0);
    }

另请注意,我在上面的代码中没有显式强制转换来让编译器控制间接引用级别是否正确。

关于c - 数组元素打印的地址是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36307817/

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