C 这个代码、数组和指针的输出是什么

C 这个代码、数组和指针的输出是什么,c,arrays,pointers,data-segment,C,Arrays,Pointers,Data Segment,关于下面的代码,我有几个问题 如果我有一个某种类型的指针,那么对它使用数组索引意味着什么?在本例中,ptr[3]代表什么(ptr是某种类型的指针) 程序的输出应该是存在或不存在(哈姆雷特),但我不确定为什么,我的问题是(&ptr2)[3]=str,我不明白这一行如何更改ptr1数组的第三个元素 int main() { char str[] = "hmmmm..."; const char *const ptr1[] = {"to be", "or not to be", "that is

关于下面的代码,我有几个问题

  • 如果我有一个某种类型的指针,那么对它使用数组索引意味着什么?在本例中,
    ptr[3]
    代表什么(ptr是某种类型的指针)
  • 程序的输出应该是
    存在或不存在(哈姆雷特)
    ,但我不确定为什么,我的问题是
    (&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;
    }
    
    intmain()
    {
    字符str[]=“hmmmm…”;
    const char*const ptr1[]={“未来”,“还是未来”,“这就是问题”};
    char*ptr2=“这就是问题所在”;
    (&ptr2)[3]=str;
    strcpy(str,“(哈姆雷特)”);
    对于(int i=0;i
  • 使用visualizer,我们可以看到ptr1将指向str,我只是不明白为什么会发生这种情况

    谢谢你的帮助

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

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

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

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


    如果有人告诉你这个程序的输出应该是“生存还是毁灭(哈姆雷特)”,那你就错了。

    知道语法
    ptr[3]
    *(ptr+3)
    完全相同可能会有帮助。你应该读一本关于数组和指针的教程。
    ptr[3]
    将通过向指针基址添加
    3*sizeof(datatype)
    并取消对它的引用来访问数组的第四个元素(注意,第一个元素始终是
    0
    ,而不是
    1
    )。@0x5453只有当数组的类型是大小为1字节的类型(例如
    char
    )时,这才是真的,它不适用于例如
    int
    (如果您使用的不是8位CPU),尽管此用户提出了不同的问题。
    (&ptr2)[3]
    将取消对ptr2的引用(因此它将是一个
    字符**
    ,指向指针内存的指针)并写入该指针。它很可能会写入一个随机位置(地址存储在内存中)并损坏
    ptr2
    @EricPostpischil请原谅,但这是一个严肃的评论还是一个幽默?@EricPostpischil Ok。我无意暗示它不能被调试或分析,因为它根本不是真的。但是“模式”和“保证”是有区别的。@EricPostpSchil我很有信心,一般用户都知道没有C程序(或任何语言)可以违反物理定律。@EricPostSchil我在声明中并不是指逻辑真值,而是指它在实践中有多重要。我们每天说的话都不是100%正确的。有时重要,有时不重要。当然,当我说你没有任何保证时,我可以加上后缀“…根据C标准”,但我不确定这是否会让人们更清楚。