【发布时间】:2023-04-10 17:46:01
【问题描述】:
当我们谈到解引用时,有必要在其中使用*吗?如果我们以其他方式访问指针的所指对象,是否可以认为是解引用指针,例如:
char *ptr = "abc" ;
printf( "%c" , *ptr ); // Here pointer is dereferenced.
printf( "%s" , ptr ); // What about this one?
这是我问题的第一部分。
现在如果printf( "%s" , ptr ) 是取消引用的一个例子,那么也请回答我的问题的以下部分。
K&R 说
“指向无效的指针”用于保存 任何类型的指针,但不能是 取消引用自身
因此,
char a = 'c' ;
char *p = &a ;
void *k = &a;
printf( "\n%c\n" , *p );
printf( "\n%c\n" , *k );
不编译,编译器报错
在函数'main'中:警告: 取消引用“void *”指针错误: 无效表达式的使用无效
但是如果我们使用
char *a = "c" ;
char *p = a ;
void *k = a;
printf( "\n%c\n" , *p );
printf( "\n%s\n" , k );
它编译并工作。这意味着可以取消引用 void 指针 - 我们得到了对象指针所指的对象。
如果是这样,那么上面提到的 K&R 在这种情况下是什么意思?
感谢您的宝贵时间。
【问题讨论】:
-
我没有看到您在哪里成功取消引用
void*。请重新阅读您的代码。
标签: c pointers dereference