指针与函数参数的几个问题不太理解(基础)
-----------------------------------问题一:---------------------------------------------
程序代码:
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 编辑 ]









