char ** str声明的是一个指向指针的指针str,所以在char* p=NULL的时候p是str这个指针所指向的指针,而&p才是形参str对应的实参
char *getstr(char ** str)
{ *str=(char *)malloc(sizeof("aaa"));//仅仅只是分配足够的内存
if(str!=NULL) //如果内存分配成功,一般都是成功的
strcpy(*str,"aaa");//将字符串"aaa"的首地址赋给指针*str
//这里缺少一句返回值语句 return *str;
}
void main()
{ char* p=NULL;
getstr(p);//这句与下一句会报错,因为无法将char*转化为char**型
printf("p1=%s",p);
getstr(&p);//获取到&p也就获取到指针p了
printf("p2=%s",p);//逐个输出字符串,这个很常见了
注意char**可以强制转化为char*,但是char*不能强制转化为char**型,如果强制转换,虽然编译不报错,但是运行时内存会出错。
楼主这道题确实厉害,我只能捡些会的回答了
1. char** str 声明的是一个指向指针的指针,假如说 char* a指向一个常量,那么a中存储的就是这个常量的地址,而str就指向这个常量的地址所存储的位置。
2. &p 这个呢,&参与到运算式中时,它的作用就是求该变量的地址,所以,&p表示的就是指针变量p的地址(注意,不是指针指向的地址,该指针变量所在位置的地址),所以此时&标示的就是指向指针的指针。
3. 了解以上两个问题之后有关&p如何传递到函数getstr(char** str)就好理解了,因为str和&P都是指向指针的指针,所以就可以理所当然的进行传递了。
4. 这一点我也无法理解,所以有关p1和p2的结果我无法回答,只能在这里提出一个问题,希望高手能够解答。
p既然是一个空指针,那么传递到getstr(char** str)以后 str应该也是一个空指针,那么*str应该是无法实现的,又怎么能执行 *str=(char *)malloc(sizeof("aaa"));语句呢?
p1会出error吧,**str是指向char的指针的指针,p是指向char的指针,p的地址&p就是指向地址的指针的内容,
null vcd as