指针与函数参数的几个问题不太理解(基础)
-----------------------------------问题一:---------------------------------------------程序代码:
void test(int *s, int num)//一级指针实现 和 void test(int **s, int num)二级指针 都能实现功能,请问这两种写法有什么区别? { *s = malloc(sizeof(int)* num); } void main(void) { int *p = NULL; test(&p,5); *p = 123456; printf("%d\n",*p); if (p){free(p);p = NULL;} getchar(); return; } //main里调用test(&p,5),由被调函数分配堆内存。问题来了,原test函数是用二级指针(void test(int **s, int num))来实现的。后来我修改城一级指针(void test(int *s, int num))也能实现(vs2013测试通过)。请问这两种写法有什么区别?
-----------------------------------问题二:---------------------------------------------
程序代码:
void myMalloc(char *s)//用问题一的测试方式,函数参数改为一级指针却不行。二级指针却可以void myMalloc(char **s),为什么? (&p)取指针p的地址作实参传递给形参,那么形参s的值就是p的地址。通过*s指向p的内容为什么却不能改变p的值呢? { *s = (char *)malloc(100); } void main(void) { char *p = NULL; myMalloc(&p);//去p的地址传入 if (p){free(p);p = NULL;}//p的值还是NULL,这里报错 getchar(); return; }
-----------------------------------问题三:---------------------------------------------
程序代码:
void myMalloc(char *s) { //*s = (char *)malloc(100); *s = 32; //为什么这样却能修改指针p 的值?那为什么“问题二”malloc出来的地址却不能修改呢? } void main(void) { char *p = NULL; myMalloc(&p); printf("%d %d\n", p); //能打印p的值 32 //if (p){free(p);p = NULL;} getchar(); return; }
[ 本帖最后由 xg911335 于 2015-7-8 01:23 编辑 ]