[英]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.