C 字符数组的文字字符串初始值设定项
在以下规则中,当数组衰减为指针时: 表达式中出现的array-of-T类型的左值[见问题2.5]衰减(有三个例外)为指向其第一个元素的指针;结果指针的类型是指向T的指针 (当数组是sizeof或&运算符的操作数,或是字符数组的文字字符串初始值设定项时除外。) 当数组是“字符数组的文字字符串初始值设定项”时,如何理解这种情况?请举个例子C 字符数组的文字字符串初始值设定项,c,string,pointers,arrays,c99,C,String,Pointers,Arrays,C99,在以下规则中,当数组衰减为指针时: 表达式中出现的array-of-T类型的左值[见问题2.5]衰减(有三个例外)为指向其第一个元素的指针;结果指针的类型是指向T的指针 (当数组是sizeof或&运算符的操作数,或是字符数组的文字字符串初始值设定项时除外。) 当数组是“字符数组的文字字符串初始值设定项”时,如何理解这种情况?请举个例子 谢谢 这是字符数组的文本字符串初始值设定项: char arr[] = "literal string initializer"; 也可以是: char* st
谢谢 这是字符数组的文本字符串初始值设定项:
char arr[] = "literal string initializer";
也可以是:
char* str = "literal string initializer";
K&R2中的定义:
字符串文字,也称为字符串
常量,是一个字符序列
用双引号括起来,如中所示
"...". 字符串的类型为``数组
字符“”和存储类静态
(见下面的PAR .A.3)并初始化
使用给定的字符。是否
相同的字符串文字是不同的
是否定义了实现,以及
试图执行以下操作的程序的行为:
alter字符串文字未定义
数组不会衰减为指针的三个例外情况如下: 异常1.-当数组是
sizeof
的操作数时
int main()
{
int a[10];
printf("%zu", sizeof(a)); /* prints 10 * sizeof(int) */
int* p = a;
printf("%zu", sizeof(p)); /* prints sizeof(int*) */
}
异常2.-当数组是和运算符的操作数时
int main()
{
int a[10];
printf("%p", (void*)(&a)); /* prints the array's address */
int* p = a;
printf("%p", (void*)(&p)); /*prints the pointer's address */
}
异常3。-当使用文本字符串初始化数组时
int main()
{
char a[] = "Hello world"; /* the literal string is copied into a local array which is destroyed after that array goes out of scope */
char* p = "Hello world"; /* the literal string is copied in the read-only section of memory (any attempt to modify it is an undefined behavior) */
}
你似乎是从comp.lang.c常见问题解答(可能是旧版本,也可能是印刷版本;它与在线版本的当前状态不太匹配)中提取了这句话:
相应的部分链接到常见问题解答的其他部分,以详细说明这些例外情况。在您的情况下,您应该查看:
假设声明
char foo[] = "This is a test";
char *bar = "This is a test";
在这两种情况下,字符串文本“这是一个测试”
”的类型都是“字符的15元素数组”。在大多数情况下,数组表达式会隐式地从类型“T的N元素数组”转换为“指向T的指针”,表达式的计算结果为数组第一个元素的地址。在条
的声明中,这正是发生的情况
但是,在foo
的声明中,表达式用于初始化另一个数组中的内容,因此不会转换为指针类型;相反,字符串文本的内容被复制到foo
正如Prason提到的,这些都不是同一件事,Eli。那么在这些示例中,什么的字符串文字输入斜体化器是什么?什么是不衰减到指针的“T的数组类型的左值”呢?在所有编辑之前,我更喜欢你的答案。简明扼要地回答了问题。现在它回答了许多甚至没有被问到的问题。:-)谢谢你,普拉森。一些问题:(1)在异常3中,左值“Hello world”是字符数组“a”的字符串文字初始值设定项,因此“Hello world”不会衰减为指针?(2) 在例外情况2中,“&a”是否与数组“a”的第一个元素的地址相同?答案是(1)是,(2)否。对于(2),在大多数计算机上,如果打印值,它们将打印相同的值(我不知道它们在哪里不打印)。但是&a
指向整个数组,而&a[0]
指向a
的第一个元素。因此,如果打印&a+1
和&a[0]+1
,即使&a
和&a[0]
打印相同的值,它们也会不同。是的,&a的值与数组“a”的第一个元素的地址值相同,但它们的类型不同。谢谢。我认为stirng literal是右值而不是左值,因为它是只读内存中某些存储的值,而不是存储本身,不能出现在=。如果我错了,那么除了字符串文字以外的任何文字也可以是左值?那么左值是什么意思?左值与右值的区别是什么?相关:+1给出了清晰简洁的答案;可能这里唯一一个表明异常与文字字符串有关,而不是它所分配的字符数组(假设两者都是字符数组)。“这是一个测试”
,因为字符串初始值设定项是一个数组。作为一个表达式,它不会衰减为指针,但仍然是一个数组。杰出的