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
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标准”,但我不确定这是否会让人们更清楚。