C编程:去引用指针

C编程:去引用指针,c,function,pointers,struct,C,Function,Pointers,Struct,我有这三份文件。使用结构、函数和指针 尝试这样做: void getName(Name*)-接收指向名称的指针并执行操作 联系人 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

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

尝试这样做:

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

联系人

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);
}
[编辑: 我将代码最小化为:

#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;
}
#包括
结构名{
char firstName[31];
};
结构触点{
结构名称;
};
void getName(Name*Name);
内部主(空)
{
结构接触;
getName(&contact.name);
返回0;
}
void getName(Name*Name)
{
查尔·约恩;
printf(“请输入联系人的名字:”);
scanf(“%c”,name->firstName);
printf(“名字:%c\n”,name.firstName);
返回;
}
得到这些错误:

1) .error:未知的类型名称name

void getName(Name*Name);

2) .在函数mainmain中:

警告:函数的隐式声明--
getName
您的意思是--
getline
吗?[-Wimplicit函数声明]

getName(&contact.name);

3) .在高层:

错误:未知类型名称–名称


void getName(Name*Name)

有很多错误,但我认为您的主要错误是您已将
Name
声明为
struct Name
,因此当您说
struct Foo{…}时,您需要使用
struct Name
而不是
Name

在C中,您不是用名称
Foo
定义类型,而是用名称
Foo
**定义
struct
,该名称被引用为
struct Foo

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


有两种修复程序的方法:

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

  • 编写一个定义类型的
    typedef
    。如下声明您的结构:

    struct Foo { ... };
    typedef struct Foo Foo;
    
    由于C程序员是懒惰的Git,他们通常会将这两条语句合并到以下声明中:

    typedef struct Foo { ... } Foo;
    
    这在一条语句中声明了
    struct Foo
    及其别名
    Foo


  • typedef的形式值得一些解释。我发现最容易将其视为一个变量声明,前面加了
    typedef
    将变量名转换为类型名。也就是说,如果可以用

    char* array[10];
    
    然后,您可以使用

    typedef char* ArrayType[10];
    
    之后,您可以使用一个简单的

    ArrayType array;
    
    所以,当你说

    typedef struct Foo Foo;
    

    第二个
    Foo
    是要声明的名称,它的别名类型是声明的其余部分,没有
    typedef
    struct Foo
    ,取消引用指针意味着使用*运算符访问存储在指针上的值。但请记住,存储在指针地址上的值r必须是与指针“指向”的变量类型相同的值到,但除非指针设置正确,否则无法保证情况会如此。

    不要包括
    *.c
    文件!永远不要。直到你成为专业人士并确切知道你在做什么。这是一项作业,他们希望我们包括所有三个文件。他们不会问这样的问题。如果他们是-我会重新考虑在这个计划中学习cce.@SaM Eugene是对的,永远不应该包含c文件。c文件应该被编译和链接(从这个意义上说,包括在输出可执行项目中),您认为使用
    scanf(“%s”)吗
    使用
    char
    变量地址是一个好主意?仔细阅读
    scanf
    的工作原理……是的,我得到了,谢谢,它修复了未知类型的错误。我在函数的名称前面放了
    struct
    。非常感谢它提供的帮助。它给出了错误:在非结构中请求成员
    firstName
    e或union@SaM啊,忽略了这个错误:当
    firstName
    是指针时(用
    struct Name*firsName
    声明),您不能使用
    运算符访问其成员。您必须改用取消引用
    ->
    运算符。现在我将尝试将其分别放在
    *.h
    *.c
    main
    中。是的,我将
    Struct
    放在名称及其工作之前。感谢您的帮助。出现了此新错误:r请求非结构或联合中的成员名(
    *.h
    *.c
    main
    ),现在头文件中有两种错误,一种是与get*类型冲突,另一种是结构的重新定义*
    ArrayType array;
    
    typedef struct Foo Foo;