关于C语言指针一点疑问

int get_memory(char **p)
{
(*)p = "hello";
}
int main(int argc, char argv[])
{
char *str = NULL;
get_memory(&str);
printf("%s\n", str);
system("PAUSE");

return 0;
}
为什么printf("%s\n", str);里面str前面不用加
??str不是指向hello的地址吗?为什么不需要解引用?

这是printf函数内部做了处理,当它发现是%s关键字,它会自己取去变量地址等来进行字符串输出

str 本身就是字符串指针,在 printf 中使用时当然不用再加什么。
另外一个问题,"hello" 只是一个局部变量,出了 get_memory 后地址可能就不存在了。这样在 main 中使用时,可能会出错。

你这段代码首先就是错的
1。p是char**,而“hello”是char[],相当于char*,他们之间如何能赋值呢-_-||
2。就算你把char** p改成char* &p也不行,因为有的不规范实现(但不是全部)会把hello存放在栈中,函数返回后调用者或被调用者中的一个会清栈,printf引用非法内存会出现未定义的问题。
至于说为什么不用解引用,是因为不需要,printf会根据你提供的地址遍历内存直到\0,然后输出。

“zuishikonghuan”说的很透彻,说出了说有问题。

建议你细看一下《高质量程序设计指南》,作者:林锐 / 韩永泉

 int get_memory(char **p)    
{
*p = "hello";        /*   *p解引用后,得到main函数中str的地址,  可以对main函数中的str 字符指针变量赋值, “hello”存放在字符串常量区,  str的值经过赋值运算后,等于"hello" 的首地址, 应该是“0x8048"开头的一个地址编号,你可以打印出来看看*/
}
int main(int argc, char *argv[])
{
char *str = NULL;
get_memory(&str);   
printf("%s\n", str);    /* 由于printf 在实现的时候, 对字符串的处理是从首地址开始遍历, 直到遇到'\000' 结束,所以不需要解引用,%s 需要对应字符串地址, 这里不能使用*str 这样的写法, *str 的结果是字符 'h',  你可以用%c 打印出来观察 一下  */
system("PAUSE");

return 0;
}

printf函数中需要向str的指针,来输出其指向的内容

p是**类型,怎么能接受*类型的数