繁体   English   中英

'一元*'的无效类型参数(具有'int')。 基本上我在指针和结构的逻辑上遇到麻烦

[英]invalid type argument of 'unary *' (have 'int'). Basically I'm having trouble with the logic of pointers & structs together

我在这里有这段代码,它给了我编译器错误,而且我知道这里还有很多其他问题,标题基本上完全相同。 我已经阅读了其中许多内容,但并未回答我所有的问题。 在过去的几天里,我在stackoverflow以及教学站点上已经阅读了很多有关指针和结构的信息,其中又有数十篇,我觉得我只需要一个物理示例来剖析和解释。 我觉得我知道大多数这些东西,但是我对自己的不确定性比我想做的要多得多。 如果有人可以帮助我了解正在发生的事情。 我在下面发布了一个编号列表,告诉您我的想法,并希望我在大多数情况下是对的,而不必为您做些开玩笑的哈哈解释。 好了,这里是代码。

struct foo{
    int num;
    char  *word;
    struct foo *ptr;
};

void func1(struct foo*);
void func2(struct foo);

int main() {

    struct foo a;
    a.num = 20;
    a.word = "wordOne";
    func1(&a);
    printf("%d %s", a.num, a.word);       // refer to #3 below.

    a.ptr = &a;
    a.num = 55;
    a.word = "thirdToLastWord";
    func2(a);
    printf("%d %s\n", a.num, a.word);
}

void func1(struct foo *a)
{
    while(*(a->word) != '\0')
        {
            putchar(*(a->word));
            a->word++;
        }
    putchar('\n');
    if(a->num % 10 != 0)
        { a->num *= 2; }
    a->word--;
    printf("num equals %d\n", (*a).num);
}

void func2(struct foo a)
{
    if((*a).num == a->ptr->num)               //compiler error
        {(*a).num = (*((*a).ptr)).num +1; }   //compiler error
    else    {   a->num = 200;   }
    a->word = "wordsix";
    a->ptr->word = "wordseven";
    printf("function 2 %d %s\n", (*a).num, (*((*a).ptr)).word);}
}

好。 所以我想我了解第一个功能。 但是,如果我错了,或者我对它为什么要做的事情有一个错误的理解,请对以下任何一项进行纠正。

1)在主func1声明结构“ foo”作为指针之前。 当调用func1时,我们传入“ a”的地址,因此我们知道要指向的地址。

2)func1中的所有内容都会更改原始结构。 当在func1外部打印时,该词递减以仅显示最后一个字母“ e”。

3)在一行中,我评论了#3,它打印出了原始struct foo的.num而不是指针版本(即使它们是同一个东西)。

我希望到目前为止还没有弄乱。

4)好了,所以a.ptr =&a将原始foo结构中的struct var“ struct foo * ptr”设置为等于a的地址; 恰好是指针“ struct foo * ptr”找到自己的确切结构。对吗?

5)我们指的是他是(main / orig结构)的成员,他已经被确立为main之上的指针。

6)那么这是否使结构内部的结构无限循环,并通过自身内部的指针将它们链接在一起?

我认为编译器错误是我肯定会遇到问题的地方。

7)首先,设置a.ptr =&a; 我们将带有初始化指针“ ptr”的struct副本传递给函数func2,是吗?

8)在第一个if stmt中,看起来我们正在比较a-> word与a-> ptr-> num。 我假设的意思是说:IF {属于成员“ a”指向的结构的“单词”等于成员“ num”,属于指针“ ptr”指向的结构,而“ ptr是再次由指针“ a”指向}看起来不错,但我认为不是。

9)如果是这样,则下面的行完全相同,并加上+1。

10)最后,我想主函数中的最终printf会打印出进入func2之前的num和word或func2中的某些指针更改了它们的值。

我将非常感谢您提出的所有反馈和建议,这些建议和建议使我牢记此指针&&结构ptr-> member和/或structure.member。

另外,我不确定这是否出现在我的问题中,但我对双指针也相当不满意。 如果不是很麻烦,有人可以告诉我如何将双指针本身集成到我的代码中吗?

谢谢

a不是指针。 您经常使用->运算符来访问非指针struct成员,这给了您错误。

您的代码中有很多错误。 例如,您没有为*word分配内存。 但是在其中存储一个值:

a.word = "wordOne";

您应该将struct成员num作为a.num访问。

这是有关使用指向结构的指针的教程,这可能有助于您理解它。

这段代码中确实有很多错误,为清楚起见,我将尝试遍历您的列表。

1.)是的,您可以在此处传递指针,但是在取消引用指针参数之前必须检查NULL。 如果您现在就习惯这样做,那么您将节省数不清的时间来跟踪细分错误的来源。

2.) func1不会更改a->num

if(a->num % 10 != 0)
    { a->num *= 2; }
// a->num % 10 = 20 % 10 = 0, and 0 != 0 is false

另外,Blue Moon关于a->word是正确的,这可以通过以下两种方法之一正确完成。

与全球:

const char *global = "wordOne";

int main(int argc, char *argv[]) {
  a.work = (char*)global;
  /*...*/
}

或“蓝色月亮”所指的首选方式:

const char *global = "wordOne";

int main(int argc, char *argv[]) {
  size_t sz = sizeof(global);
  a.work = (char*)malloc(sz);
  for(int i = 0; i < sz; i++) { a.work[i] = global[i]; }
  /*...*/
}

注意:使用第二种方法,您最终将需要free()该内存。

阅读更多有关指针的内容,您会明白为什么

关于func2() ,此函数不使用指针参数,因此取消引用它肯定会引发编译错误。

void func2(struct foo);
// struct foo is passed 'by value'

我真的希望这有助于清理问题! :-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM