问题描述
我对指针和嵌套结构是陌生的。代码如下:
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++;
}