A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马志华 中级黑马   /  2014-12-16 19:44  /  681 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. #include <stdio.h>


  2. int main()
  3. {
  4.     char cs[5]={'a','A','B','D','f'};
  5.     printf("%p\n",cs);
  6.    
  7.     for (int i =0; i<5; i++) {
  8.         printf("cs[%d]的地址是:%p\n",i,&cs[i]);
  9.     }



  10.     return 0;
  11. }
复制代码


为什么printf("%p\n",cs);不用加&就能输出地址;而 printf("cs[%d]的地址是:%p\n",i,&cs);要加&才能输出地址?

5 个回复

倒序浏览
我又试了一下,printf("%p\n",cs);加不加&都能输出地址;而 printf("cs[%d]的地址是:%p\n",i,&cs);必须加&才能输出地址,求大神指教!!!
回复 使用道具 举报
花轮 来自手机 中级黑马 2014-12-16 20:30:07
藤椅
我记得mj大神视频好像有说过 数组传的本来就是地址 你可以再看一下那节
回复 使用道具 举报
编程语言就是约定一些规则很多时候没有为什么,方便理解、方便记忆就可以了吧。
比如楼主的问题,第一个是(&cs)而第二个(&cs[i]),第二个是值得cs数组的第i个元素的地址,是吧cs[i]看做一个整体然后再结合&的。
回复 使用道具 举报
受教了,谢谢给位
回复 使用道具 举报
printf("%p\n",cs); // 0x7fff5fbff7a3 输出数组地址 == 数组首元素地址 指向char类型的指针
printf("%p\n",cs + 1); // 0x7fff5fbff7a4  比上个地址多了1 和char占一字节相符

printf("cs[%d]的地址是:%p\n",i,&cs[i]); // 输出数组元素地址 不加&则是把cs[i]存的值以%p输出,即把'a' == 97 以十六进制形式输出:0x61。

&cs,得到的是“指向数组的指针“,是指向“有5个元素的char数组”类型的指针。指针+1后移动了5个位置。
printf("%p\n",&cs); // 0x7fff5fbff7a3
printf("%p\n",&cs + 1); // 0x7fff5fbff7a8
其实p1 = &cs 和 p2 = cs 两种指针值一样,只是类型不同。

百度了下了解到这么个事:在C中, 在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址。 它的类型取决于数组元素的类型。但有两种特例,数组名并不是用指针常量来表示,1.sizeof;2.&。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马