在该情况下,下面的规则阵列时衰减到指针:

  

这是左值[参见问题2.5]型阵列的-T出现在表达衰变(有三个例外)转换成一个指向它的第一个元素的;所得指针的类型是指针到-T。

     

(例外情况是,当阵列是的sizeof或&运算符的操作数,或为字符数组一个文本字符串初始化。)

如何理解当阵列是“为一个字符数组文字串初始值设定”的情况下?一些示例请。

谢谢!

有帮助吗?

解决方案

在三个例外,其中的阵列不衰减到指针如下:

<强>异常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) */
}

其他提示

假设声明

char foo[] = "This is a test";
char *bar  = "This is a test";

在这两种情况下,字符串“This is a test”的类型是“炭的15个元素的数组”。在大多数情况下,阵列表达式隐式地从类型“T的N元件阵列”到“指针T”转换,并且所述表达式的计算结果到所述阵列的所述第一元素的地址。在声明bar,这也正是发生了什么。

在声明foo,然而,表达被用来初始化该内容的另一阵列,并且因此转换为指针类型;相反,内容字符串文字的被复制到foo

这是一个字符阵列的文字串初始化:

char arr[] = "literal string initializer";

也可以是:

char* str = "literal string initializer";

从K&R2定义:

  

一个字符串文字,也称为串   常数,是字符序列   用双引号包围中   “...”。甲串具有类型``的阵列   人物'和存储类static   (见下文Par.A.3)和初始化   与给定的字符。是否   相同的字符串文字是不同的   是实现定义,并且   试图程序的行为   改变文字的字符串是未定义的。

好像你从comp.lang.c常见问题拉那报价(也许是旧版本或者也许是印刷版本;它不完全匹配与在线一个的当前状态):

http://c-faq.com/aryptr/aryptrequiv.html

在相应的部分链接到FAQ的其他部分详细说明这些例外。在你的情况,你应该看看:

http://c-faq.com/decl/strlitinit.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top