c语言 - 为什么我们在传递给 printf 时不需要取消引用指向字符串的指针?


#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打印相同字符串的原因是表达式&strstr的值相同。

要打印字符串,必须指定格式说明符%s,对应的参数必须是指向char的指针。

printf("String is:%s",p);

当你想打印一个标量值(如int类型的对象)时,你必须将其本身指定为printf的参数在这个语句中

printf("Values of variable pointed to by pa is %dn", *pa);

表达式*pa确实是int类型的对象。

最新更新