【问题标题】:What is the output of this code, array and pointers这段代码、数组和指针的输出是什么
【发布时间】:2019-07-17 00:55:17
【问题描述】:

我对下面的代码有几个问题。

  1. 如果我有某种类型的指针,那么对它使用数组索引意味着什么?在这个例子中,ptr[3] 代表什么(ptr 是某种类型的指针)?
  2. 程序的输出应该是to be or not to be (Hamlet),但我不知道为什么,我的问题是(&ptr2)[3] = str这行,我不明白这行如何改变ptr1的第三个元素数组。

    int main()
    {
     char str[] = "hmmmm...";
     const char *const ptr1[] = {"to be", "or not to be", "that is the question"};
     char *ptr2 = "that is the question";
    
     (&ptr2)[3] = str;
    
     strcpy(str, "(Hamlet)");
     for (int i = 0; i < sizeof(ptr1) / sizeof(*ptr1); ++i)
     {
        printf("%s ", ptr1[i]);
     }
     return 0;
    }
    

使用this 可视化器,我们可以看到ptr1 将指向str,我只是不明白为什么会这样。

帮助表示赞赏。

【问题讨论】:

  • 知道ptr[3] 的语法与*(ptr + 3) 完全相同可能会有所帮助。
  • 您应该阅读有关数组和指针的教程。
  • ptr[3] 将通过将3*sizeof(datatype) 添加到指针基址并取消引用它来访问数组的第四个元素(注意第一个元素始终是0,而不是1)。
  • @0x5453 仅当数组的类型是 1 字节大小的类型时才适用(例如char),它不适用于例如int(如果您使用的不是 8 位 CPU)
  • 这个duplicates the code in yesterday’s question 虽然这个用户提出了不同的问题。

标签: c arrays pointers data-segment


【解决方案1】:

如果我有某种类型的指针,那么对它使用数组索引意味着什么?在这个例子中,ptr[3] 代表什么(ptr 是某种类型的指针)?

在 C 中,a[i]*(a + i) 的语法糖。这是指针的有效语法,即使它们不指向数组。

程序的输出应该是或不是(哈姆雷特),但我不知道为什么,我的问题在于 (&ptr2)[3] = str 行,我不明白怎么做这一行改变了 ptr1 数组的第三个元素。

(&amp;ptr2)[3] 行不会改变 str1 中的任何内容。它试图访问一个未知的内存位置。

如果你被告知这个程序的输出应该是“to be or not to be (Hamlet)”,那么你被告知错了。

【讨论】:

  • (&amp;ptr2)[3] 将取消对 ptr2 的引用(因此它将是 char **,指向指针内存的指针)并写入该指针。它很可能会写入随机位置(地址存储在内存中)并损坏ptr2
  • @EricPostpischil 原谅我,但这是一个严肃的评论还是只是幽默?
  • @EricPostpischil 好的。好吧,我无意暗示它不能被调试或分析,因为它根本不是真的。但是“模式”和“保证”是有区别的。
  • @EricPostpischil 我非常有信心,普通的 SO 用户明白没有 C 程序(或任何语言)可以打破物理定律。
  • @EricPostpischil 我指的不是陈述中的逻辑真值,而是它在实践中的重要性。我们每天都会说一些不是 100% 正确的话。有时它很重要,有时它不重要。当然,当我说你没有任何保证时,我可以添加后缀“...根据 C 标准”,但我不确定这会让人们更清楚地了解情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
相关资源
最近更新 更多