【问题标题】:Why isn't this pointer dereferenced?为什么这个指针没有被取消引用?
【发布时间】:2015-04-18 13:42:13
【问题描述】:

我注意到,当通过指针打印字符串时,指针不应被取消引用。为什么?

$ cat c.c
#include <stdio.h>

int main(){
    char foo[] = "Meirav";
    char *bar = foo;

    printf("%s\n", foo);
    printf("%s\n", bar); // Why isn't this dereferenced?
    printf("%p\n", bar);

    return 0;
}

$ gcc -Wextra c.c
$ ./a.out
Meirav
Meirav
0x7fffda789ae0

这是取消引用指针的结果,我收到编译器警告和运行时错误:

$ vim c.c
$ grep '&bar' c.c
        printf("%s\n", &bar);
$ gcc -Wextra c.c
c.c: In function ‘main’:
c.c:8:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char **’ [-Wformat=]
  printf("%s\n", &bar);
  ^
$ ./a.out
Meirav
��~|�
0x7fff7c7eafa0

为什么不应该取消引用指针?

这是我的环境:

$ uname -a
Linux melancholy 3.13.0-48-generic #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
$ cat /proc/version
Linux version 3.13.0-48-generic (buildd@orlo) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015
$ cat /etc/issue
Ubuntu 14.04.2 LTS \n \l

【问题讨论】:

  • &amp;bar 不会取消引用指针 bar。它给出了指针的地址,即char**。取消引用=*bar
  • 为什么你认为应该这样做?
  • 为什么会这样? "%s" 需要一个指向 char 的指针。 bar 是指向 char 的指针
  • @bolov:谢谢,您的评论让问题变得清晰。

标签: c linux pointers gcc


【解决方案1】:

我想你有一个困惑,&amp; 是运营商的地址,所以假设你有这个

char  string[] = "Meirav";
char *foo      = string;
char **bar     = &foo;

那么您需要取消对指针的引用,以获取在使用 "%s" 说明符时必须传递给 printf()char 指针,如下所示

printf("%s\n", *bar); /* Why isn't this dereferenced? */
/*             ^ dereference operator                 */

注意&amp; 操作符创建一个带有变量地址的指针,在这种情况下变量是一个指针,因此它是指针的地址,所以你需要用* 取消引用指针取消引用运算符,以便将其传递给printf()

【讨论】:

  • 谢谢,我没有意识到 %s 需要一个指针,而 char string[] = "Meirav"; 本质上是一个指针。
猜你喜欢
  • 2017-09-28
  • 2022-07-27
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 2013-04-01
  • 2011-03-23
  • 1970-01-01
相关资源
最近更新 更多