小白求解为什么我这一段C语言代码**p无法输出???

include

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** 俩个完全不搭怎么赋值
把这句注掉可以输出这个变量的地址 不知道你想输出什么 也不知道你想验证什么

代码打错了,是下面的

include

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就行了