|
发表于 2004-12-20 23:13:17
|
显示全部楼层
Post by suowei1979
不知我这样修改大家有什么不同的观点:)
- #include<stdio.h>
- #include<malloc.h>
- void foo(int a,char **b)
- {
- sprintf(*b,"you are %d years old!\n",a);
- }
- int main(void)
- {
- char *f = (char *)malloc(64);
- foo(23,&f);
- printf("%s\n",f);
- free(f);
- }
复制代码
如果你在函数调用前分配内存,那么传双指针是多此一举,
- #include<stdio.h>
- #include<malloc.h>
- void foo(int a,char *b)
- {
- sprintf(b,"you are %d years old!\n",a);
- }
- int main(void)
- {
- char *f = (char *)malloc(64);
- foo(23,f);
- printf("%s\n",f);
- free(f);
- }
复制代码
跟正解是同样结果,但偏离了题意,该题就是考双指针.当形参是单指针时,如果作为指针的实参没显式赋值(没分配地址),函数调用时,编译器仍当它为自动变量,函数返回后,啥都没变改,但如果调用前有给实参显式赋值(分配了地址),那就当成地址传递,地址里的值就会被调用函数改变.
而双指针编译器当它就是地址,任何地方改变它的值,它都会随之改变,包括当函数参数.
可以说得再明白一点:
这两句,a是一个指针变量,b是一个整形变量,a如果不分配地址,它永远不叫"地址",只叫指针变量.你把它当参数传递,没有任何意义.;
这两句,a可以叫作指针数组,b是一个整形数组,这两个变量在任何地方出现都是地址;只不过在应用中,a和b都要指定大小:如
- char** a=(char*) malloc(10)...;
- int b[10]=...;
复制代码
你可以把
- char** a=(char* )malloc(10);同
- char* a=(char* )malloc(10);
复制代码
作两种理解 |
|