黑马程序员技术交流社区

标题: 关于第六天课后题第五题的解释 [打印本页]

作者: 大家叫我小祥子    时间: 2015-4-15 22:24
标题: 关于第六天课后题第五题的解释
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!








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

最后一个,没完整,特妹的,丢了好几段数据
作者: adslunk    时间: 2015-4-15 22:37
指针定义的字符串值不可以改变,
数组的可以改变
作者: 花短裤的夏天    时间: 2015-4-15 22:40
大神,看不懂,飘过~
作者: 大家叫我小祥子    时间: 2015-4-15 22:48
郑亚恒 发表于 2015-4-15 22:33
棒棒哒!另附上个人见解,交流下哈

睡觉,以为能忽悠几个币,白写了,算了算了
作者: Theshy    时间: 2015-4-15 22:50
今天跟大婶也聊了下    明白是传进去了数组的首地址,然后在  s=“hello whorld”  卡壳了 ,上边既然传递的是 地址值 算不算是值传递。。越想越晕了:shutup:
作者: 大家叫我小祥子    时间: 2015-4-15 22:54
adslunk 发表于 2015-4-15 22:37
指针定义的字符串值不可以改变,
数组的可以改变

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

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

话说,你这个结论我与的又联系?
作者: 花短裤的夏天    时间: 2015-4-15 23:00
花短裤的夏天 发表于 2015-4-15 22:40
大神,看不懂,飘过~

哈哈,好吧,我瞅瞅哪里有卖的
作者: wws    时间: 2015-4-16 01:24
非常好,虽然依旧云雾缭绕,但过程还是获益不少,也浪费了你的一些时间,thank!()




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2