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

时间:2015-07-24 10:46:19

标签: 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;
}

在参考上面的代码时:

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

p将显示存储的字符串。

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

但是,如果我想显示a=10的值,我必须写*pa

为什么这样?这两者之间的区别是什么?

为什么使用p时显示正确,而其他人在使用时显示正确*pa

在一种情况下使用derefernce运算符,而在其他情况下则不需要

2 个答案:

答案 0 :(得分:5)

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

  • %s期待&#34;指针&#34; type(确切地说,&#34;指向初始的指针 字符类型&#34; )参数数组的元素,因此,我们传递指针。
  • %d期望int作为参数,因此,我们需要传递变量值,即取消引用指针。

答案 1 :(得分:-2)

首先,编译器应至少为语句

发出诊断消息
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 %d\n", *pa);

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