在这段代码中有一些疑问......(指针)

时间:2013-06-29 14:14:01

标签: c 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]

2 个答案:

答案 0 :(得分:4)

进行作业时,作业的双方都需要类型兼容

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

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


好读:
How do I use arrays in C++?

答案 1 :(得分:3)

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

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

在你发布的表达中包装它

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

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