我注意到当通过指针打印字符串时指针不应被解除引用。为什么呢?
$ 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
答案 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}}取消引用运算符,以便将其传递给*
。