开发者社区> 问答> 正文

<Expert C Programming>一书中关于数组和指针重要区别

int main(){

    char p[5] = "abcd";
    printf("p:%p &p:%p *p:%c *(&p):%c\n", p, &p, *p, *(&p));

    char* q = "abcd";
    printf("q:%p &q:%p *q:%c *(&q):%c\n", q, &q, *q, *(&q));
}

在《C专家编程》里一书中写到C语言中指针和数组最大的区别莫过于: 文件1: char p[5] = "abcd"; ......

文件2: extern char* p;

若此时在文件2中使用任何诸如p[2],就会导致错误输出。原因在于指针的下标引用和数组的下边引用存在微妙的区别,数组直接用自己地址加偏移量后产生地址的内容,而指针先获取自己所在地址的内容,再加获取加上偏移量后地址中的内容。只有出现如上声明才会导致这样的错误输出。

如上上述代码输出所示,数组名的地址和所保存的内容均为第一个元素的地址,和指针不同。 输出: p:0028FF30 &p:0028FF30 p:a (&p):0 q:00403000 &q:0028FF2c q:a (&q):

我的问题在于,如今的编译器已经不允许这样的问题出现,只是作为对C语言细节的探究写出上面的代码,(&p) 没有输出 p是为什么呢?现在的编译器和语言标准又是如何约定这个问题的呢?

展开
收起
a123456678 2016-06-06 09:59:42 2077 0
1 条回答
写回答
取消 提交回答
  • 楼主的问题有点绕口,我试图来理解一下。

    首先,对于类型为array的情况,p和&p的值是一样的,我假设楼主已经理解这点,就略过不具体说了。
    那么,p和&p就完全一样了吗?显然答案是否定的 ---- 区别在于p和&p的类型是不一样的。

    对于标准C来说,这里的p可以看作(转化为)一个指向数组p的第一个元素的指针,因此它的类型是指向p[0]的指针。
    而&p,则视为一个指向整个数组p[]的指针,因此类型是指向数组的指针。
    很显然,不同类型的输出当然会不一样。

    在楼主的例子中,如果把(&p):%cn改为(&p):%sn就可以看出区别了。

    2019-07-17 19:27:44
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载