微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

指针和嵌套结构如何工作?

如何解决指针和嵌套结构如何工作?

我对指针和嵌套结构是陌生的。代码如下:

updateContact(struct Contact contacts[]);
getContacts(struct Contact* pContact);
getNumbers(struct Numbers* pNumbers);

#include <stdio.h>
struct Numbers
{
    int streetNumber;
};

struct Contact
{
    struct Numbers numbers;
};

int main()
{
    struct Contact contactArr[] = { 1,2,3,4 };
    updateContact(contactArr);

    for (int i = 0; i < 4; i++)
    {
        printf("%d",contactArr[i]);
    }
    return 0;
}

updateContact(struct Contact contacts[])
{
    getContacts(&contacts);
}

getContacts(struct Contact* pContact)
{
    getNumbers(/*need help here*/);
        //what arguments should I pass so that the pointer pNumbers gets correct argument and updates the values  
}

getNumbers(struct Numbers* pNumbers)
{
    //update the values of all 4 elements to 5,6,7,8
}

如何将这些数据存储在内存中,如果有人可以通过解释帮助我想象,我试图思考但无法正确理解,程序如何从指向结构的指针到访问指针指向的嵌套结构的成员。

解决方法

第一个问题是,您需要先声明结构,然后才能在函数原型中使用它们。因此,将原型移到结构定义之后

下一个问题是只有main具有类型。其余功能默认为int。如果函数未返回任何内容(如此类),则在前向声明以及函数定义本身中都将其声明为void

接下来是一系列函数调用updateContact ---> getContacts ---> getNumbers。我认为您在这里对数组语法和指针感到困惑,但是可以很容易地将其清除:它们是同一回事。让我们看一下从main开始的每个参数的样子:

    struct Contact contactArr[] = { 1,2,3,4 };
    updateContact(contactArr);

什么是contactArr它是4个Contact结构的数组。另一种说法是它是指向4个Contact结构中的第一个结构的内存地址的指针。当您调用updateContact时,它正在接收该内存地址。

updateContact(struct Contact contacts[])
{
    getContacts(&contacts);
}

这以struct Contact contacts[]作为参数。可以用另一种方式写:struct Contact* contacts。现在,它需要一个指针。明白我说的是同一回事的意思吗?

这里有问题。 getContacts(&contacts)不能满足您的需求。这是因为contacts已为内存地址。如果这样做,您将使用地址的地址。那有什么好处?删除&,然后将其传递给内存地址。

好吧,现在您遇到的部分是问题:

getContacts(struct Contact* pContact)
{
    getNumbers(/*need help here*/);
        //what arguments should I pass so that the pointer pNumbers gets correct argument and updates the values  
}

需要struct Contact* pContact,但是我们不是刚刚看到了吗?与updateContact相同,但写法不同。所以这将是相同的值。

这最后一点对我来说没有任何意义:

getNumbers(struct Numbers* pNumbers)
{
    //update the values of all 4 elements to 5,6,7,8
}

如果要为此传递一个struct Numbers*,则需要更改getContacts。我想你的意思是这样:

// Takes a pointer to a Contact type
void getContacts(struct Contact* pContacts) {
    for (int n = 0; n < 4; n++) {
        getNumbers(&pContacts[n].numbers);
    }
}

// Takes a pointer to a Numbers type
void getNumbers(struct Numbers* pNumber) {
    static int val = 5;
    //update the values of all 4 elements to 5,8
    pNumber->streetNumber = val++;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。