gpt4 book ai didi

c - 为什么 printf( "%s", ptr ) 能够取消引用 void*?

转载 作者:太空狗 更新时间:2023-10-29 17:09:40 26 4
gpt4 key购买 nike

当我们说到解引用的时候,是不是一定要用到*呢?如果我们以其他方式访问指针的引用对象,是否可以将其视为取消引用指针,例如:

char *ptr = "abc" ;
printf( "%c" , *ptr ); // Here pointer is dereferenced.
printf( "%s" , ptr ); // What about this one?

这是我问题的第一部分。

现在,如果 printf( "%s", ptr ) 是取消引用的示例,那么也请回答我问题的以下部分。

K&R 说

a "pointer to void" is used to hold any type of pointer but cannot be dereferenced itself

因此,

char a = 'c' ;
char *p = &a ;
void *k = &a;
printf( "\n%c\n" , *p );
printf( "\n%c\n" , *k );

不编译,编译器报错

In function ‘main’: warning: dereferencing ‘void *’ pointer error: invalid use of void expression

但是如果我们使用

char *a = "c" ;
char *p = a ;
void *k = a;
printf( "\n%c\n" , *p );
printf( "\n%s\n" , k );

它编译并工作。这意味着可以取消引用 void 指针 - 我们已经得到了指向的对象指针。
如果是这样的话,那么 K&R 上面提到的引用在这种情况下意味着什么?

感谢您的宝贵时间。

最佳答案

没有。你所拥有的是“未定义的行为”——C 语言标准没有说明应该发生什么。在您的情况下,它“有效”,但对于另一个用户/编译器/平台可能无效。你的陈述:

printf( "\n%s\n" , k );

相当于:

int k = 42;
printf( "\n%s\n" , k );

同样是未定义的。

关于c - 为什么 printf( "%s", ptr ) 能够取消引用 void*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3352091/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com