C编程:解引用指针

问题描述 投票:0回答:3

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

试着这样做:

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 function pointers struct
3个回答
1
投票

当你在C中说struct Foo {...};时,你没有定义一个名为Foo的类型。相反,你正在用struct **这个名字定义一个Foo,它被称为struct Foo

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


修复程序有两种方法:

  1. 打电话给你的结构struct。在您的代码中有Name的每个实例中,确保您实际上是在说struct Name
  2. 写一个定义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是正在声明的名称,它别名的类型是没有typedefstruct Foo的声明的其余部分。


0
投票

有很多错误,但我认为你的主要错误是你已经宣布Namestruct Name所以你需要使用struct Name而不仅仅是Name


0
投票

取消引用指针意味着使用*运算符来访问存储在指针中的值。但请记住,存储在指针地址中的值必须是与指针“指向”的变量类型相同类型的值,但除非指针设置正确,否则无法保证这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.