2种结构声明的区别

Differences between 2 kinds of structure declare

对于此代码:

typedef struct book_s{
char name[50];
char author[50];
int price;
} book_t;

我要声明这个结构的 2 个变量:

struct book_s first_book;
book_t second_book;

first_booksecond_book是同一种类型吗? 如果是这样,这两行是

first_book.name

second_book.name

要为输出提供相同类型的字符串吗?

不,虽然它们共享一个类型,但它们是具有不同内存位置的完全不同的变量。

类型名称 book_tstruct book_s 别名 。它们是相同的类型,可以互换使用。因此结构objects(结构实例)也是相同的类型。

结构对象(实例)不同且不同,但它们具有相同的类型。

是的,它们都是"book_s"结构类型 但!他们不一样 instance/object.

例如:

结构book_sfirst_book;
// ^- 你现在有一个名为 "first_book" 的对象,类型为 book_s

book_t second_book;
// ^ 你现在有第二个对象 "second_book" 类型 book_t
// 这是 struct book_s

的别名

将字符串设置为:first_book.name 不会影响字符串:second_book.name

呼叫:first_book.name 将 return 一个字符串,但与另一个对象 "second_book.name"

不同

它们都return相同的类型:字符串 它们都有其他值。

希望对您有所帮助!

这两个对象声明

struct book_s first_book;
book_t second_book;

是等价的。

在第一个声明中使用了类型说明符struct book_s。在第二个声明中使用了 typedef 名称,它是类型说明符 struct book_s.

的别名

此外,您甚至可以通过以下方式编写 typedef

typedef struct book_s{
    char name[50];
    char author[50];
    int price;
} book_s;

并定义像

这样的对象
struct book_s first_book;
book_s second_book;

这些表达式

first_book.name

second_book.name

是对first_booksecond_book两个对象声明结构的数据成员name的成员访问表达式。

这是一个演示程序

#include <stdio.h>

typedef struct book_s{
    char name[50];
    char author[50];
    int price;
} book_t;

int main(void) 
{
    struct book_s first_book = 
    { 
        "Expert C Programming", "Peter van der Linden", 10
    };
    book_t second_book =
    {
        "Head First C", "David Griffiths and Dawn Griffiths", 15
    };

    printf( "%s by %s (%d)\n", first_book.name, 
                               first_book.author, 
                               first_book.price );
    printf( "%s by %s (%d)\n", second_book.name, 
                               second_book.author, 
                               second_book.price );

    return 0;
}

它的输出是

Expert C Programming by Peter van der Linden (10)
Head First C by David Griffiths and Dawn Griffiths (15)