我有这三个文件。使用结构,函数和指针。
试着这样做:
void getName(Name *)
- 接收指向名称的指针并执行操作
contacts.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);
contacts.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中收到以下错误:
错误:解除引用指向不完整类型struct name的指针
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
â;你是说âgetline
â? [-Wimplicit函数声明]
getName(&contact.name);
3)。在顶层:
错误:未知类型名称âName
â
void getName(Name*name)
当你在C中说struct Foo {...};
时,你没有定义一个名为Foo
的类型。相反,你正在用struct
**这个名字定义一个Foo
,它被称为struct Foo
。
因此,当你说void getName(Name*name);
时,你的编译器正确地抱怨没有名为Name
的类型。由于它无法解析此函数声明,因此它会在您调用它时抱怨不知道该函数。忽略第二个错误,这不是你的问题。修复原型。
修复程序有两种方法:
struct
。在您的代码中有Name
的每个实例中,确保您实际上是在说struct Name
。typedef
类型的Name
。像这样声明你的结构:
struct Foo { ... };
typedef struct Foo Foo;
由于C程序员是懒惰的gits,他们通常会将这两个语句合并到以下声明中:
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
的声明的其余部分。
有很多错误,但我认为你的主要错误是你已经宣布Name
为struct Name
所以你需要使用struct Name
而不仅仅是Name
。
取消引用指针意味着使用*运算符来访问存储在指针中的值。但请记住,存储在指针地址中的值必须是与指针“指向”的变量类型相同类型的值,但除非指针设置正确,否则无法保证这种情况。