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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 第一梦 中级黑马   /  2015-8-13 22:13  /  709 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. struct Person{
  2.         char *name;
  3.         int age;
  4.     };
  5.     struct Person per={"haha",2};
  6.     struct Person *p=&per;
  7.     char **pc=&(per.name);  //per.name的地址是存在pc,还是*pc,还是**pc?
  8.     printf("%p\n",pc);      //pc表示什么意思,里面存的是什么?是地址还是值?
  9.     printf("%s\n",*pc);     //*pc表示什么意思,里面存的是什么?是地址还是值?
  10.     printf("%c\n",**pc);     //**pc表示什么意思,里面存的是什么?是地址还是值?
  11.     printf("%d\n",*((int*)(pc+1)));    //这个地方为什么要加一个(int*)
复制代码


各位坛友,请抽出几分钟时间,给我解释一下上面的代码,回答一下代码后面注释里的问题,小妹在这里多谢你们了!!!

4 个回复

倒序浏览
我来试着解释一下吧:
printf("%p\n",pc);  输出的是地址,是二维指针pc所指向的地址。也就是应该是一个一维指针变量自己的地址。
printf("%s\n",*pc); 输出的是字符串haha,因为指针p指向的是字符串haha的首地址,输出的就是haha。
printf("%c\n",**pc);输出的是字母h,它相当于是输出了pc[0][0]的值。
printf("%d\n",*((int*)(pc+1))); 我也还没有学struct这里,但是int应该是因为pc定义的char,要输出数字,所以要定义一个int类型。
写的有错误的话,再探讨。
回复 使用道具 举报
1)char **pc=&(per.name); per.name的地址存在了二级指针pc里面, pc是一个指向指针的指针,per.name本身就是一个char *类型的变量,所以得有一个char **的指针来存储char *变量的地址。所以per.name的地址存在了二级指针pc里面
2)printf("%p\n",pc); 输出的是pc的地址,pc表示一个指向char *类型的变量的指针,pc内存里存的是per.name的地址
3) printf("%s\n",*pc); *pc是根据pc中存储的地址找到相应的内存,输出该内存中的值。
4) printf("%c\n",**pc); 输出per.name的第一个字符,根据上面那句话,*pc就是per.name,**pc就是*per.name,*name就是找到首地址的内存

回复 使用道具 举报
楼下解答的不错
回复 使用道具 举报
本帖最后由 yushimin763 于 2015-8-14 11:06 编辑

pc指向的是per.name的地址,*pc指向的是存放per.name的地址的值,**pc指的是取*pc指向的地址的值所以第一行输出的是per.name的地址
第二行输出的是pc指向的per.name的首地址(由于是字符串看作字符数组)由于输出以%s输出字符串所以输出“haha”
第三行相当于输出per.name的首地址的值,所以为‘h’
第四行相当于per.name的首地址+1,指向了per中age的地址所以要强转成int类型输出


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马