Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 字符数组的文字字符串初始值设定项_C_String_Pointers_Arrays_C99 - Fatal编程技术网

C 字符数组的文字字符串初始值设定项

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

在以下规则中,当数组衰减为指针时:

表达式中出现的array-of-T类型的左值[见问题2.5]衰减(有三个例外)为指向其第一个元素的指针;结果指针的类型是指向T的指针

(当数组是sizeof或&运算符的操作数,或是字符数组的文字字符串初始值设定项时除外。)

当数组是“字符数组的文字字符串初始值设定项”时,如何理解这种情况?请举个例子


谢谢

这是字符数组的文本字符串初始值设定项:

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给出了清晰简洁的答案;可能这里唯一一个表明异常与文字字符串有关,而不是它所分配的字符数组(假设两者都是字符数组)。
“这是一个测试”
,因为字符串初始值设定项是一个数组。作为一个表达式,它不会衰减为指针,但仍然是一个数组。杰出的