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
的类型。由于它无法解析此函数声明,因此它随后会抱怨您在调用该函数时不知道该函数。忽略第二个错误,这不是您的问题。修复原型
有两种修复程序的方法:
调用structstruct
。在代码中包含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;