#include <stdio.h>
struct mychar {
char value;
struct mychar *nextPtr;
};
typedef struct mychar Mychar;
void insert(Mychar **, char );
int main(){
Mychar *startPtr = NULL; // line 13
insert(&startPtr, 'b');
}
void insert(Mychar **sPtr, char myvalue){
if (**sPtr == NULL){ // if I put double ** it doesn't work. it works only with one *
// do stuff
}
我得到了这个错误。
liste_collegate.c:13:13: error: invalid operands to binary expression ('Mychar' (aka 'struct mychar') and 'void *')
if (**sPtr == NULL){
~~~~~~ ^ ~~~~
我真的不明白为什么我在第13行的startPtr中用 Mychar *startPtr = NULL;
然后我通过 地址 该指针的 insert
函数,如果我输入两个**,就不能得到值,但只有当我只输入一个*时才有效。
我是不是应该去引用两次才能得到值呢?NULL
? 我的意思是,如果我通过一个 地址 的 指针 到一个函数中,该函数需要先去掉一个指针以达到第一个指针内的地址值,然后再去掉一个指针以达到该地址的实际值......。
为什么不成功呢?
我当然知道肯定有问题,只是不知道为什么。
"我是不是应该贬值两次才能达到价值?
NULL
??"
吗?
这是因为 NULL
是一个宏,用于分配或比较一个 指针 到一个空指针(一个没有指向(有效)内存的指针);它只用于指针,而不是它的引用对象--它们所指向的对象(除非引用对象也是一个指针,你想检查是否为 NULL
但这里不是这样的)。)
**sPtr
是指向类型的指针 Mychar
. 如果你取消引用 sPtr
( 指 *sPtr
)访问它所指向的指针(实际上是 startPtr
中的),这对于检查 startPtr
对于 NULL
.
如果您使用 if (**sPtr == NULL)
你试图取消引用 startPtr
- a NULL
指针--本身是无效的,并试图检查对象的 startPtr
是指向(其实什么也没有)为 NULL
但不是 startPtr
.
欢迎要求进一步的说明。
在main()中,你定义了startPtr是一个指针,指向一个Mychar类型的位置。在上图中,你的startPtr类似于int *p。你把startPtr的地址传给了插入函数。也就是说,你在上图中传递了类似于int **pp的东西。
当你刚才打sPtr的时候,你看到的是那个变量里面的值,这个值和上图中**pp包含的值类似(0x450)。
当你说*sPtr的时候,你是在dereferencing sPtr里面的值,这个值类似于*p中包含的值(0x200),在你的例子中是3,所以,dereferencing一次就够了。当你取消引用两次时,你就会取消引用3,如果地址3不是你的进程的一部分,可能会引起分段故障。
你有没有看到编译代码时的警告和错误。
Mychar *startPtr = 3; // line 13
这一行引起了警告:
警告: 初始化使指针从整数中产生,而没有进行转换 [-Wint-conversion] 。
if (**sPtr == 3)
这一行会引发错误。
错误:二进制操作数无效 == (有 'Mychar {aka struct mychar}' 和 'int')
对于警告,你试图将指针赋值给一个整数,也许你想要这样的东西。
Mychar startValue;
startValue.value = 3;
// then initialize the pointer by making it point to address of startValue
Mychar *startPtr = &startValue;
对于错误(用你的更新来回答), 你试图用NULL指针来比较一个值. 正如你的最后一个问题。NULL
只用于指针,所以你可以将指针NULL和另一个指针进行比较。也许你可以。
if (*sPtr == NULL) {}
// OR
if (*sPtr == NULL) {}
// But not
if (**sPtr == NULL) {}