有关指针的问题,请高手帮忙
[color=#FF0000]案例一:这是会出现段错误的[/color]void get(char *p){ p = (char *)malloc(20);}void test(void){ char *str = NULL; get(str); str(str, "hello"); printf("%s\n" i
void get(char * & p){ p = (char *)malloc(20);}
[解决办法]
ckt1120 的第一句话已经说明了所有的问题了,“C里只有传值方式”,确实是这样,实际上的传址,也只是另一种方式的传值罢了
[解决办法]
c语言里面的函数参数都会产生一个临时变量
所以你在函数里面改变的仅仅是这个临时变量
而出函数后,这个变量本身是不变的
c++有传值和引用俩种
引用不会产生临时变量
[解决办法]
如果你要改变形参中传入参数的值,就一定要使用指针形式
所以形参要改成 ** p, 调用的时候传入地址(或者说是指针) &str
[解决办法]
我传的是我指针指向的地址,我要传指针本身的地址做什么呢?
还有那个return返回的不就是我指针指向的地址吗?
烦详解,谢谢楼上诸位
[解决办法]
void也是可以有返回的,跟编译器有关系?
你返回值是void值,然后赋给指针类型,就又按照指针解释了,所以不会出现问题。
[解决办法]
q = get(str);
这个语句是包含了隐式转换的。
[解决办法]
我传的是我指针指向的地址,我要传指针本身的地址做什么呢?
还有那个return返回的不就是我指针指向的地址吗?
-----------------------------------------
问题1:(案例1)你传入的是个指针,但是函数内部你操作的对象还是这个指针,这是无法修改你原来传入值的对象的
考虑一下为什么下面这个函数是个错误的swap函数
void swap(int a , int b)
{
int tmp = a;
a = b;
b = tmp;
}
而正确的swap应该是
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
问题2:(案例2)基于你在案例1的程序中对get函数加入了一个return但是实际你的函数根本是没什么用
一是void 函数怎么可能有return X?二是回到问题1,由于c是值传递,在一个函数中(如你写的这类函数)
你对一个非指针变量进行修改就要传入其地址,
对一个指针变量修改就要传入一个指针的指针,这就是为什么楼上的代码出现了指针的指针