void f(int ** q);
int main()
{
int * p;
f(&p);
return 0;
}
void f(int ** q)
{
q=8;
printf("%d",q);
}
printf 没加 \n
有输出值8;如果把printf放在main函数中就不会有输出值或乱码。
8是int 这个q是指针的指针 也就是int** 俩个完全不搭怎么赋值
把这句注掉可以输出这个变量的地址 不知道你想输出什么 也不知道你想验证什么
代码打错了,是下面的
void f(int ** q);
int main()
{
int * p;
f(&p);
return 0;
}
void f(int ** q)
{
q=8;
printf("%d",q);
}
你后面改过的那个代码,还不能输出吗???
= =为什么我这有输出
楼上正解,你把q指针改变了,指向就变了。
一个一级指针能解决的战斗,为啥写俩,这么写,图啥?
这里的q 是被调函数在调用时开辟的一段空间,名称为q,是个二级指针,指向一级指针,你把原来一级指针的地址给了这个q,再使q里面的值为 8;
这样写不合法, 如果是赋值的话,得这么写,** q = 8;
而上述的写法也有很大的缺陷。 由于你的main函数里定义的p是个野指针,p里面存的地址指向不知道的区域,所以这样会非法改动系统没有给你的内存,
可能会报 段错误;最好的写法是:
在main中:
int num;
int *p =NULL;
p = #
f(&p);
在void f()中:
q = 8;
printf("%d\n",q);
这里你有很多错误,q存的是p的地址,如果要打印的话 应该用格式控制符 %p
而不是 %d 而且 比较重要的一点是 %d后面没有加 \n
这里一定要注意:缓冲区的问题;
printf() 函数 默认打开的缓冲区 是 stdout ,你往屏幕上打印的东西,是先存在这个缓冲区里,等待 \n 或者缓冲区满了,再或者程序结束,
才会打印输出,你这里不加虽然说程序结束也会打印出来,大师如果有下面这个例子:
#include<stdio.h>
#include
int main(int argc, char **argv)
{
printf("hello");
memset(stdout,0,sizeof(stdout)); //清空缓冲区
return 0;
}
如果这样写,那么屏幕上不会有hello
因为你的hello在stdout中 之后又清空了缓冲区
那么程序结束后 缓冲区里就没有任何东西
所以加上 \n 比较稳妥
。。。**q是二级指针,*q是变量地址,改成**q就行了