2

这是工作正常的代码......

int main()
{
    char c[]={'\t','\n','\0'};
    int i;
    char *p,*str;
    str=c;
    p=&c[1];
    printf("%d\n%d\n",*p,*str);
    system("pause");
    return 0;
}

我的问题是为什么是它str=c;而不是str=&c;(它给出错误)和它p=&c[1]; 而不是p=c[1]

4

2 回答 2

4

进行分配时,分配的双方都需要类型兼容

在某些情况下,数组的名称会衰减为指向其第一个元素的指针。因此c返回指向 char 的指针,即char *,虽然&c给出了数组的地址,但显然不是类型char *类型strischar*),类型不匹配会以编译错误的形式为您提供诊断。

&c[1]给你一段char *时间c[1]给出该索引处的值,即:char. 在这种情况下,类型p再次是,char *因此是观察到的结果。


好读:
如何在 C++ 中使用数组?

于 2013-06-29T14:19:47.360 回答
3

当在表达式中使用时,对类型对象array-of-T(即数组名称)的引用会衰减为指向其第一个元素的指针。[1]此类指针的结果类型为pointer-to-T.

此外,当您通过索引访问数组元素时,它会被取消引用。这就是为什么你用&它来获取它的地址。

总结一下,在您发布的表达式中

  • c相当于&c[0]
  • c[1]是数组中第二个位置的值。&c[1]是它的内存地址,即指向它的指针。

[1] 这个事实有四个值得注意的例外:当数组是 a 的操作数时sizeof&或 - 自C11以来-_Alignof运算符,或当它是字符数组的字符串字面量初始值设定项时。参考:http ://c-faq.com/aryptr/aryptrequiv.html 。

于 2013-06-29T14:17:05.253 回答