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

use*_*147 -22 c pointers dereference

#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 %d\n",a);
  printf("Contents of pa is %x\n", (int)pa);
  printf("Values of variable pointed to by pa is %d\n", *pa);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在参考上面的代码时:

p = &str;
printf("String is:%s",p);
Run Code Online (Sandbox Code Playgroud)

p将显示存储的字符串.

pa = &a;
printf("Values of variable pointed to by pa is %d\n", *pa);
Run Code Online (Sandbox Code Playgroud)

但在这里,如果我想显示价值,a=10我将不得不写*pa.

为什么这样 ?这两者有什么区别?

为什么一个在使用时显示正确p,另一个在使用时显示正确*pa

在一种情况下使用derefernce操作符,而在另一种情况下不需要derefernce操作符

Sou*_*osh 5

阅读基础知识printf()和格式说明符.

  • %s期望一个"指针"类型(确切地说,"指向字符类型数组的初始元素的指针")参数,因此,我们传递指针.
  • %d期望一个intas参数,因此,我们需要传递变量值,即取消引用指针.