#include<stdio.h>
int main()
{
char *p = NULL;
char str[] = "How do you do!!!!!";
p = &str;
printf("String is:%s",p);
p = "HELLO HOW ARE YOU";
printf("String is:%s",p);
printf("Hello");
int a = 10;
int *pa;
pa = &a;
printf("Contents of a is %dn",a);
printf("Contents of pa is %xn", (int)pa);
printf("Values of variable pointed to by pa is %dn", *pa);
return 0;
}
参考上面的代码:
p = &str;
printf("String is:%s",p);
p将显示存储字符串。
pa = &a;
printf("Values of variable pointed to by pa is %dn", *pa);
但是这里如果我想显示a=10
的值,我就必须写*pa
。
为什么?这两者有什么区别?
为什么一个用p
显示正确而另一个用*pa
显示正确
在一种情况下使用解引用操作符,在另一种情况下不需要
阅读printf()
的基础知识和格式说明符
-
%s
期望"指针"类型(是精确的,"指向初始值的指针")字符类型为""的数组元素的参数,所以,我们传递的是指针。 -
%d
期望int
作为参数,因此,我们需要传递变量值,即取消对指针的引用。
首先,编译器应该至少为语句
发出诊断消息。p = &str;
,因为类型char *
(p的类型)和char ( * )[19]
(表达式&str
的类型)之间没有隐式转换。
所以你只需要写
p = str;
printf打印相同字符串的原因是表达式&str
和str
的值相同。
要打印字符串,必须指定格式说明符%s
,对应的参数必须是指向char的指针。
printf("String is:%s",p);
当你想打印一个标量值(如int类型的对象)时,你必须将其本身指定为printf的参数在这个语句中
printf("Values of variable pointed to by pa is %dn", *pa);
表达式*pa
确实是int类型的对象。