gpt4 book ai didi

C编程: dereferencing pointers

转载 作者:行者123 更新时间:2023-11-30 14:52:18 25 4
gpt4 key购买 nike

我有这三个文件。使用结构体、函数和指针。

尝试这样做:

<强> void getName(Name *) - 接收指向名称的指针并执行操作

联系人.h

struct Name {
char firstName[31];
char middleInitial[7];
char lastName[36];
};
struct Contacts {
struct Name name;
struct Address address;
struct Numbers numbers;
};
void getName(struct Name*name);

联系人.c

#include <stdio.h>
#include "contacts.h"

void getName(struct Name*name)
{
char yorn;
printf("Please enter the contact's first name: ");
scanf("%s", name->firstName);

printf("Do you want to enter a middle initial(s)? (y or n): ");
scanf("%s", &yorn);

if (yorn == 'y'){
printf("Please enter the contact's middle initial(s): ");
scanf("%s", name->middleInitial);
}

printf("Please enter the contact's last name: ");
scanf("%s", name->lastName);
}

a1ms4.c

#include <stdio.h>
#include "contacts.h"
#include "contacts.c"

struct Name name;
getName(&contact.name);

我在 contacts.c 中收到以下错误:

错误:取消引用指向不完整类型结构名称的指针

scanf("%s", name->firstName);

                 ^~

[编辑:我将代码最小化为:

#include <stdio.h>

struct Name {
char firstName[31];
};

struct Contacts {

struct Name name;
};

void getName(Name*name);

int main(void)
{

struct Contacts contact;
getName(&contact.name);
return 0;
}

void getName(Name*name)
{
char yorn;
printf("Please enter the contact's first name: ");
scanf("%c", name->firstName);

printf("First name: %c\n", name.firstName);

return;
}

并收到这些错误:

1).错误:未知类型名称 â Name ➡️

void getName(Name*name);

2).在函数 â main 中â:

警告:函数的隐式声明 â getName A;您的意思是 â getline A? [-W隐式函数声明]

getName(&contact.name);

3).在顶层:

错误:未知类型名称 â Name ➡️

void getName(Name*name)

最佳答案

当您在 C 中说 struct Foo {...}; 时,您并没有定义名为 Foo 的类型。相反,您通过名称 Foo **定义一个 struct,它被引用为 struct Foo

因此,当您说 void getName(Name*name); 时,编译器会正确地提示没有名为 Name 的类型。由于它无法解析此函数声明,因此它随后会提示在调用该函数时不知道该函数。忽略第二个错误,这不是你的问题。修复原型(prototype)。

<小时/>

有两种修复程序的方法:

  1. 调用您的结构struct。在代码中包含 Name 的每个实例中,请确保您实际上说的是 struct Name

  2. 编写一个定义类型Nametypedef。像这样声明你的结构:

    struct Foo { ... };
    typedef struct Foo Foo;

    由于 C 程序员都是懒惰的 git,他们通常会将这两个语句合并到以下声明中:

    typedef struct Foo { ... } Foo;

    这在一条语句中声明了 struct Foo 及其别名 Foo。您会在实际代码中经常看到这种情况。

<小时/>

typedef 的形式值得一些解释。我发现最容易将其视为前面带有 typedef 的变量声明,以将变量名称转换为类型名称。 IE。如果你可以声明一个字符串数组

char* array[10];

然后你可以为其类型命名

typedef char* ArrayType[10];

之后,您可以使用简单的声明上面的数组

ArrayType array;

所以,当你说

typedef struct Foo Foo;

第二个 Foo 是正在声明的名称,它的别名类型是声明的其余部分,不带 typedef:struct Foo.

关于C编程: dereferencing pointers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47683396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com