繁体   English   中英

对此代码有疑问...(指针)

[英]Have a few doubts in this code…(pointers)

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

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]

进行分配时,分配的两侧都需要类型兼容

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

&c[1]为您提供一个char *c[1]为您提供该索引处的值,即: char 在这种情况下, p 类型也是char * ,因此观察到的结果。


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

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

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

在你发布的表达式中包装它

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM