1、今天YUSEN问我关于第六天的第五题的问题,我明白是那个意思,但是就是感觉解释错了,对YUSEN说声抱歉,我把那个问题拿来分析分析,我尽可能从内存等地方给你们解释,还有一点关于这个题目的变形,希望自己说的清楚明白,说的对!2、可能不会一次性解决完,总的来说,我本人有点“天马行空”,想到哪里说那里,所以呢,可能会有点,或者后期再补充
- #include <stdio.h>
- void f(int *s)
- {
- s = "hello whorld";
- }
- int main()
- {
- char s[] = "hello c!";
- f(s);
- printf("%s", s);
- return 0;
- }
复制代码
分析:
1、主函数定义了一个字符数组 char s[] = "hello c!";
2、主函数调用函数f(s),并将数组名传进去
请注意:
1)void f(int *s),这个函数是一个参数列表整形的指针
2)数组类型是char 类型的,这样存在一个问题,数组类型不匹配(??????????????? 后面我再讨论这个问题,先解决我们这个)
但是这个整形指针还是指向了字符数组,只要打印char s[] 数组和被调用函数f(int *s)即可
证明
- #include <stdio.h>
- void f(int *s)
- {
- printf("%p\n",s);
- s = "hello whorld";
- }
- int main()
- {
- char s[] = "hello c!";
- printf("%p\n",s);
- f(s);
- printf("%s", s);
- return 0;
- }
- 结果是:
- 0x7fff5fbff7af
- 0x7fff5fbff7af
- hello c
复制代码
3、额 上面那个结果好像出来了, 最后出来的是 字符数组的内容,为何会这样呢 也许你们搞不懂,但是我写如下代码
- int a = 0;//定义时候初始化比较好
- int b = 0;
- int * p = NULL;
- p = &a;//首先吧指针指向变量a
- p = &b;//再把指针指向变量b
- 这样是一定可以的吧
复制代码
好了 现在也明白那个原因了吧
s = "hello whorld";
这句话的意思就是,把整型变量指向了 字符串 hello whorld的首地址(我TM怎么知道是hello whorld的地址????????????????????别急,我以后分析)
证明:
- #include <stdio.h>
- void f(int *s)
- {
- printf("%p\n",s);
- s = "hello whorld";
- printf("%p\n",s);
- }
- int main()
- {
- char s[] = "hello c!";
- f(s);
- return 0;
- }
- 结果如下:
- 0x7fff5fbff7af
- 0x100000f88
复制代码 地址改变了,说明指向的就改变了;
4、为何不是覆盖掉hello c!的值?
好吧,咋一看,我其实也蒙,待我淋淋雨,脑子凉快凉快,冷静下来之后,TM的就给自己来了个大耳巴子
s是整型的指针变量,存储的是一个地址,改变指向之后,还是指向一个地址
- s = "hello whorld";//改变了地址的值
- 与
- *s = ‘a’; //把s所指向的地址的数值给改变了
复制代码
总结一下:主函数调用被调函数,形参指针开始指向了实参,但是在函数内部,改变了指向的位置(指向了字符串常量),所以被调函数指向不会改变主函数的值,所以主函数 打印的是 hello c!
|
|