为什么这个指针不被解除引用?

时间:2015-04-18 13:42:13

标签: c linux pointers gcc

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

$ 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

1 个答案:

答案 0 :(得分:1)

我认为你有一个混乱,&是运营商的地址,所以假设你有这个

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

然后您需要取消引用指针的指针,以获取char指针,当您使用printf()说明符时必须将其传递给"%s",如此

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

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