2012-04-21 66 views
0

我在这里有这个代码,它给了我编译器错误,我知道这里有几十个其他问题,基本上完全相同;我阅读了其中的很多内容,并没有回答所有的问题。过去几天我在堆栈和教学网站上阅读了很多关于指针和结构的知识,还有几十个,我觉得我只需要在我面前解释和解释一个物理示例。我觉得我对这些东西大部分都了解,但是我比我更愿意对自己更加不确定。如果有人能帮助我理解发生了什么。我已经在下面发布了一个编号列表,告诉你我在想什么,并且希望我对大多数人都适合,而不是为了解释你需要做哈哈而开玩笑。那么这里是代码。'unary *'的无效类型参数(有'int')。基本上我遇到了指针和结构的逻辑问题

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声明struct“foo”作为指针之前。当调用func1时,我们传入“a”的地址,以便知道指向哪个地址。 2)func1中的所有内容都会改变原始结构。这个词被递减,只在func1以外打印出来时才显示最后一个字母“e”。

3)就行了我评论#3所打印出的原始结构Foo的.num没有指针的版本(即使它们是相同的东西)。

我希望我到目前为止还没有搞砸。

4)Ok a.ptr = & a将struct var“struct foo * ptr”设置为与原始foo结构相等的地址;这恰好是指针“struct foo * ptr”发现自己的确切结构。对吧?

5)我们指的是他作为(主/原结构)的成员,他已经被确立为主指针。

6)那么这是否会在由内部指针连接在一起的结构中构造无限循环的结构?

我在哪里评论编译器错误是我积极的地方我有问题。

7)首先,设置a.ptr =&a后;我们传递一个struct的初始化指针“ptr”到函数func2中,是吗?

8)在第一个if语句中,它看起来像我们正在比较a-> word到a-> ptr-> num。我假设的意思是说:IF {属于“a”指向的结构的成员“词”等于成员“num”,属于指针“ptr”指向的结构,“ptr是再次被指向指针“一”}这似乎是正确的,但我不认为这是....

9)如果是真的,那么下面的一行说添加了+1同样的事情

10)我想最终打印出来的最终printf在打开func2之前打印出了什么数字和字,或者func2中的一些指针是否改变了它们的值。

我将不胜感激您的意见和建议,我应该如何处理这个指针& &结构ptr-> member和/或structure.member在我脑海中的东西。

此外,我不确定这是否出现在我的问题,但我也很颤抖双指针以及。如果有人能告诉我一个双指针如何将自己整合到我的代码中,那么不会有太多麻烦?

谢谢

回答

0

a不是指针。您正在使用->运营商多次访问非指针struct成员,这会给您带来错误。

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

a.word = "wordOne"; 

你应该访问结构成员numa.num

这里是关于使用pointers to structures的教程,它可能会帮助你理解它。

0

在这段代码中确实存在不少错误,为了清楚起见,我会尝试下载清单。

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 

此外,蓝月亮是正确的约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' 

我真的很希望能够帮助你解决问题! :-)