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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1、今天YUSEN问我关于第六天的第五题的问题,我明白是那个意思,但是就是感觉解释错了,对YUSEN说声抱歉,我把那个问题拿来分析分析,我尽可能从内存等地方给你们解释,还有一点关于这个题目的变形,希望自己说的清楚明白,说的对!2、可能不会一次性解决完,总的来说,我本人有点“天马行空”,想到哪里说那里,所以呢,可能会有点,或者后期再补充
  1. #include <stdio.h>

  2. void f(int *s)
  3. {
  4.     s = "hello whorld";
  5. }
  6. int main()
  7. {
  8. char s[] = "hello c!";
  9.     f(s);
  10.     printf("%s", s);
  11.     return 0;
  12. }
复制代码

分析:
1、主函数定义了一个字符数组 char s[] = "hello c!";
2、主函数调用函数f(s),并将数组名传进去
请注意:
1)void f(int *s),这个函数是一个参数列表整形的指针
2)数组类型是char 类型的,这样存在一个问题,数组类型不匹配(??????????????? 后面我再讨论这个问题,先解决我们这个)
但是这个整形指针还是指向了字符数组,只要打印char s[] 数组和被调用函数f(int *s)即可
证明
  1. #include <stdio.h>

  2. void f(int *s)
  3. {
  4.     printf("%p\n",s);
  5.     s = "hello whorld";
  6. }
  7. int main()
  8. {
  9.     char s[] = "hello c!";
  10.     printf("%p\n",s);
  11.     f(s);
  12.     printf("%s", s);
  13.     return 0;
  14. }

  15. 结果是:
  16. 0x7fff5fbff7af
  17. 0x7fff5fbff7af
  18. hello c
复制代码



3、额  上面那个结果好像出来了, 最后出来的是 字符数组的内容,为何会这样呢 也许你们搞不懂,但是我写如下代码
  1. int a = 0;//定义时候初始化比较好
  2. int b = 0;
  3. int * p = NULL;

  4. p = &a;//首先吧指针指向变量a
  5. p = &b;//再把指针指向变量b

  6. 这样是一定可以的吧
复制代码

好了 现在也明白那个原因了吧


s = "hello whorld";
这句话的意思就是,把整型变量指向了 字符串 hello whorld的首地址(我TM怎么知道是hello whorld的地址????????????????????别急,我以后分析)
证明:
  1. #include <stdio.h>

  2. void f(int *s)
  3. {
  4.     printf("%p\n",s);
  5.     s = "hello whorld";
  6.     printf("%p\n",s);
  7. }
  8. int main()
  9. {
  10.     char s[] = "hello c!";
  11.     f(s);
  12.     return 0;
  13. }

  14. 结果如下:
  15. 0x7fff5fbff7af

  16. 0x100000f88
复制代码
地址改变了,说明指向的就改变了;



4、为何不是覆盖掉hello c!的值?
好吧,咋一看,我其实也蒙,待我淋淋雨,脑子凉快凉快,冷静下来之后,TM的就给自己来了个大耳巴子


s是整型的指针变量,存储的是一个地址,改变指向之后,还是指向一个地址
  1. s = "hello whorld";//改变了地址的值

  2. *s = ‘a’; //把s所指向的地址的数值给改变了
复制代码


总结一下:主函数调用被调函数,形参指针开始指向了实参,但是在函数内部,改变了指向的位置(指向了字符串常量),所以被调函数指向不会改变主函数的值,所以主函数 打印的是 hello c!







20 个回复

倒序浏览
大神啊!!!!!!!!!!!!!!你隐藏的好深啊,技术组组长的位置让给你了!  小祥子
回复 使用道具 举报
大神 求抱粗腿!
回复 使用道具 举报
蛋疼,有些自己写得被不小心搞掉了,我发现我写的不够完整,而且回复也不好对存在的一些问题做答复,以后再来讨论这个吧
回复 使用道具 举报
感觉最后一段代码总结的很好
回复 使用道具 举报
给顶了,自己宿舍的,能不顶吗!  
回复 使用道具 举报
都不来点实际的,光顶有个P用,黑马币呢? 都给妹子们了?
回复 使用道具 举报
泡沫小精灵 发表于 2015-4-15 22:34
感觉最后一段代码总结的很好

最后一个,没完整,特妹的,丢了好几段数据
回复 使用道具 举报
指针定义的字符串值不可以改变,
数组的可以改变

点评

搞错了 是在栈区  发表于 2015-4-15 23:06
如果一个字符指针指向的是一个数组,那么数组存在的是在堆区,这个值是可以改变的 如果指向的是字符串,字符串是存在与常量区,常量区里面的...   发表于 2015-4-15 22:55
回复 使用道具 举报
大神,看不懂,飘过~

点评

记得夏天时候要像你名字一样,穿着花短裤来上课.  发表于 2015-4-15 22:46
回复 使用道具 举报
郑亚恒 发表于 2015-4-15 22:33
棒棒哒!另附上个人见解,交流下哈

睡觉,以为能忽悠几个币,白写了,算了算了
回复 使用道具 举报
今天跟大婶也聊了下    明白是传进去了数组的首地址,然后在  s=“hello whorld”  卡壳了 ,上边既然传递的是 地址值 算不算是值传递。。越想越晕了:shutup:
回复 使用道具 举报
adslunk 发表于 2015-4-15 22:37
指针定义的字符串值不可以改变,
数组的可以改变

如果一个字符指针指向的是一个数组,那么数组存在的是在堆区,这个值是可以改变的

如果指向的是字符串,字符串是存在与常量区,常量区里面的数值是不可以改变的

话说,你这个结论我与的又联系?
回复 使用道具 举报 1 0

哈哈,好吧,我瞅瞅哪里有卖的
回复 使用道具 举报
wws 来自手机 中级黑马 2015-4-16 01:24:15
15#
非常好,虽然依旧云雾缭绕,但过程还是获益不少,也浪费了你的一些时间,thank!()
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马