在双指针**和常量之间进行比较,只有当我一*的时候才有效。

问题描述 投票:-1回答:2
#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? 我的意思是,如果我通过一个 地址指针 到一个函数中,该函数需要先去掉一个指针以达到第一个指针内的地址值,然后再去掉一个指针以达到该地址的实际值......。

为什么不成功呢?

我当然知道肯定有问题,只是不知道为什么。

c pointers data-structures struct linked-list
2个回答
0
投票

"我是不是应该贬值两次才能达到价值?NULL??"

吗?

这是因为 NULL 是一个宏,用于分配或比较一个 指针 到一个空指针(一个没有指向(有效)内存的指针);它只用于指针,而不是它的引用对象--它们所指向的对象(除非引用对象也是一个指针,你想检查是否为 NULL但这里不是这样的)。)


**sPtr 是指向类型的指针 Mychar. 如果你取消引用 sPtr ( 指 *sPtr)访问它所指向的指针(实际上是 startPtr 中的),这对于检查 startPtr 对于 NULL.

如果您使用 if (**sPtr == NULL) 你试图取消引用 startPtr - a NULL 指针--本身是无效的,并试图检查对象的 startPtr 是指向(其实什么也没有)为 NULL但不是 startPtr.

欢迎要求进一步的说明。


0
投票

enter image description here

在main()中,你定义了startPtr是一个指针,指向一个Mychar类型的位置。在上图中,你的startPtr类似于int *p。你把startPtr的地址传给了插入函数。也就是说,你在上图中传递了类似于int **pp的东西。

当你刚才打sPtr的时候,你看到的是那个变量里面的值,这个值和上图中**pp包含的值类似(0x450)。

当你说*sPtr的时候,你是在dereferencing sPtr里面的值,这个值类似于*p中包含的值(0x200),在你的例子中是3,所以,dereferencing一次就够了。当你取消引用两次时,你就会取消引用3,如果地址3不是你的进程的一部分,可能会引起分段故障。


0
投票

你有没有看到编译代码时的警告和错误。

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) {}
© www.soinside.com 2019 - 2024. All rights reserved.