指针问题,结果能输出hello 求解释

extern void fun(char**p);
static char *pstr= "hello";//指针pstr只可以本文件访问
void fun(char**p)//接口函数
{
*p = pstr;
}
void main()
{
char *p = NULL;
fun(&p);
printf("%s\n", p);
}

程序很正确呀。
为了区别起见,我把fun()中的参量p改作pf,对程序不会有影响。

extern void fun(char**p);//函数声明
static char *pstr= "hello";//指针pstr只可以本文件访问。可以给指针初始化时赋一个字符串给它,该指针就指向该字符串
void fun(char**pf)//接口函数。**p,是一个指向指针的指针。
{
*pf = pstr;//pstr是指针类型,pf是所指向的内容就是*pf,*pf是指针。二者都是char*类型的。
}
void main()
{
char *p = NULL;
fun(&p);//&是取地址符号,&p即可理解为 指向p的指针。&p是char**类型
printf("%s\n", p);
}
fun(&p)运行后,一个char**的参量pf生成,它被赋予的初值是&p。即pf=&p
你应该知道&p指向p,那么pf也指向p。
*pf就是p,是同一个变量。
让*pf指向另一个字符串“hello“
p也就指向了"hello"
自然能输出。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-16
首先pstr是一个静态的字符型的指针变量,它被赋了一个初值,也就是"hello"在内存中的地址
然后主函数里定义了一个指针p,被置为空,并且把它的地址作为参数传递进fun函数
注意fun函数的形参类型是指向指针的指针,所以fun函数里的*p=pstr就相当于在main函数里写上p=pstr,因此p就相当于字符串"hello"的首地址,所以
printf("%s\n", p);可以打出hello
如果你改成
printf("%c\n", *p);那么应该可以打出h本回答被提问者和网友采纳
第2个回答  2013-03-17
#include<stdio.h>

static char *pstr="hello"; /*把字符串首个字符的地址赋给pstr,pstr为指针类型*/

void fun(char **p)
{
*p=pstr;
}

void main()
{
char *p=NULL; /*防止野指针的危害,放在0地址出保安全*/

fun(&p); /*把指针变量p的地址传给二级指针形参p,在形参中执行\
*p=pstr后返回,返回形参释放的只是变量的值,但地址\
不变,此时主函数中的p已变为 “hello”的首个字符的\
的地址,和pstr相同。调用此函数的目的是间接改变p*/
printf("%s\n",p);
}
第3个回答  2013-03-16
很常用的为指针赋值的方法,如果你读过一些关于dx的代码,你会很频繁的遇到类似于
void fun(cha**p) {
*p=pstr; // 指针p指向全局变量pstr所指向的地址.
}
的代码。
第4个回答  2013-03-18
fun 的行参是二维指针 main函数中实参为&p也是二维指针, fun中*p是一维指针。 相当于 *(&p)= pstr,
也就是p = pstr