首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

有关指针的有关问题,请高手帮忙

2012-03-07 
有关指针的问题,请高手帮忙C/C++ code[color#FF0000]案例一:这是会出现段错误的[/color]void get(char *p

有关指针的问题,请高手帮忙

C/C++ code
[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


参数传的都是地址,形参里改的就是实参里的地址,为什么上面的不行,而下面的用个return接一下就行呢
指针看的太是不够多,麻烦高手详细解释一下,非常感谢

[解决办法]
你的案例虽然参数是指针形式的,但它本质上仍然是传值调用。。
对于指针。。如果你想使用地址形式的调用。。
其形式为:
void get(char **p)
{
*p = (char *)malloc(20);
}


get(&str);

[解决办法]
C里只有传值方式
所以你要改变一个参数的本身,
就必须传递参数的地址,在函数中在通过地址访问才能达到修改的目的/

你要不好理解,你先当str是一个普通的变量
如果要想在get函数中修改到str的值,哪就必须传递str的地址
所以形参类型为指向str的指针,即char** 
如proware 写的那个

-----------
第一个
void get(char *p) //修改不了参数本身的值
{
p = (char *)malloc(20);
}

第二个,返回类型应该为char*吧,没看出个参数p有啥用,用局部变量就可以了
void get(char *p)
{
p = (char *)malloc(20);
return p;
}



[解决办法]
第一个地址没有传出来
如果是C++,可以写成
C/C++ code
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是值传递,在一个函数中(如你写的这类函数)
你对一个非指针变量进行修改就要传入其地址,
对一个指针变量修改就要传入一个指针的指针,这就是为什么楼上的代码出现了指针的指针

热点排行