求解c的有关问题
求解c的问题
我对c的char型数组作为函数的参数始终闹不明白,下面是我的两个函数,有哪位大侠能告诉我是为什么吗?
1#include<stdio.h>
2
3 void my_func(char *p)
4 {
5 p="hello";
6 }
7
8 void my_func1(char *p)
9 {
10 int i=0;
11 for(i=0;i<10;i++) p[i]='a';
12 }
13
14 int main(void)
15 {
16 char a[10]={'\0'};
17 char b[10]={'\0'};
18
19 my_func(a);
20 my_func1(b);
21
22 printf("%s \n",a);
23 printf("%s \n",b);
24
25 return 0;
26 }
调用my_func后,我想是因为在其里面定义的变量p给释放l,所以打印出来的a数组什么都没有,既然如此,为什么调用my_func1后的b数组为什么有值呢?字符数组作为函数参数时到底是值传递还是地址传递?
哪位大侠帮帮忙
------解决方案--------------------
问题不在 值传递或者地址传递 问题在myfunc
p = "hello" 并不是将字符串hello赋值给P指向的地址 而是将静态字符串hello的首地址赋值给指针p
------解决方案--------------------
你调用的是指针啊!!所以会传值,但是指针还是指向同样的地方,再有你的b数组没有一'\0'结尾啊!!
------解决方案--------------------
额,按照你子函数的定义是接受一个字符的指针,指针的值为数组a的地址
但是你第一个函数改变了指针的值,这样就和a数组没有关系了,a数组没有变化。
第二个函数没有改变指针的值。直接在传递过去的地址上操作,自然会改变b的值。
我的理解是,是属于地址传递。传递过去的是数组的地址
------解决方案--------------------
传值。
数组a在栈上,第一个函数里的字符串"hello"(在常量区)并不会被拷贝到数组里(字符串拷贝需要用strcpy函数),仅仅是把"hello"的地址赋值给了指针p。函数结束后,这个p被丢弃了,原来的数组a没有任何改变。
第二个函数里,显然把10个数组元素都填充为字符'a'
我对c的char型数组作为函数的参数始终闹不明白,下面是我的两个函数,有哪位大侠能告诉我是为什么吗?
1#include<stdio.h>
2
3 void my_func(char *p)
4 {
5 p="hello";
6 }
7
8 void my_func1(char *p)
9 {
10 int i=0;
11 for(i=0;i<10;i++) p[i]='a';
12 }
13
14 int main(void)
15 {
16 char a[10]={'\0'};
17 char b[10]={'\0'};
18
19 my_func(a);
20 my_func1(b);
21
22 printf("%s \n",a);
23 printf("%s \n",b);
24
25 return 0;
26 }
调用my_func后,我想是因为在其里面定义的变量p给释放l,所以打印出来的a数组什么都没有,既然如此,为什么调用my_func1后的b数组为什么有值呢?字符数组作为函数参数时到底是值传递还是地址传递?
哪位大侠帮帮忙
------解决方案--------------------
问题不在 值传递或者地址传递 问题在myfunc
p = "hello" 并不是将字符串hello赋值给P指向的地址 而是将静态字符串hello的首地址赋值给指针p
------解决方案--------------------
你调用的是指针啊!!所以会传值,但是指针还是指向同样的地方,再有你的b数组没有一'\0'结尾啊!!
------解决方案--------------------
额,按照你子函数的定义是接受一个字符的指针,指针的值为数组a的地址
但是你第一个函数改变了指针的值,这样就和a数组没有关系了,a数组没有变化。
第二个函数没有改变指针的值。直接在传递过去的地址上操作,自然会改变b的值。
我的理解是,是属于地址传递。传递过去的是数组的地址
------解决方案--------------------
传值。
数组a在栈上,第一个函数里的字符串"hello"(在常量区)并不会被拷贝到数组里(字符串拷贝需要用strcpy函数),仅仅是把"hello"的地址赋值给了指针p。函数结束后,这个p被丢弃了,原来的数组a没有任何改变。
第二个函数里,显然把10个数组元素都填充为字符'a'