menu 光风霁月。
C 和 C++ 结构体
414 浏览 | 2020-06-20 | 阅读时间: 约 2 分钟 | 分类: C、C++ 语言基础 | 标签: 结构体
请注意,本文编写于 167 天前,最后修改于 167 天前,其中某些信息可能已经过时。

前言

最近在备战某大学暑期夏令营,算法题是必不可少的一道关。由于我没怎么系统学过 C 语言和 C++(鄙人转专业),所以到现在对结构体、内存申请啥的竟然都还不熟悉,实在太羞愧和遗憾。考研、找工作这也都应该是必备技能了,所以我跺了跺脚,狠下心来用此篇文章来终结我对 C、C++ 的恐惧感。

小碎片

using namespace std 是 C++ 中的语法特性,叫做命名空间,目的是为了阻止变量引用冲突;

#include stdio.h 是 C 语言的标准输入输出,#include <iostream> 是 C++ 的标准输入输出;

struct 关键字

在 C 语言中(后缀为 .c),可以用 struct 关键字来声明一个结构体类型,但是声明变量时必须再次使用 struct。

#include <stdio.h>

struct Student {
    int number;
};

int main() {
    Student stu;        // (*)
    struct Student stu;    // (**)
    stu.number = 10;
    printf("%d", stu.number);
};
// (*) 式结果:error: unknown type name 'Student'; use 'struct' keyword to refer to the type
// (**) 式结果: 10

在 struct 花括号外部可以紧跟着声明变量,此变量为全局变量,当前文件中的所有函数都可以访问它。

#include <stdio.h>

struct Student {
    int number;
} stu;

int main() {
    stu.number = 10;
    printf("%d", stu.number);
};
// stu 就是 Student 的一个实例变量,可以直接访问它的变量 number

typedef 关键字

因为每次都需要以 struct Student stu; 的方式声明一个 Student 的变量,很不清爽。如果在 struct 后面直接声明变量,个数是静态的,而且不能做到随时创建,按需创建,全局访问又导致安全性无法得到保障。如果使用 typedef 关键字,可以简单一些。

#include <stdio.h>

typedef struct Student {
    int number;
} Stu;

int main() {
    Stu stu;   // (*)
    struct Student stu;    // (**)
    stu.number = 10;
    printf("%d",stu.number);
};
// 此时的 Stu 相当于 Student 的一个别名。当然,原来的方式也是行得通的。即:(*) 和 (**) 式均编译正常,结果正常。

上面谈到的是仅仅关于 C 语言的(后缀为 .c),如果到了 C++ 语言(后缀 .cpp)中,又会有一些微妙变化。

struct 关键字

和前面相比,不需要再次使用 struct 来声明变量。而且 c++ 的结构体中,可以存放普通变量、结构体(又套了一层)、函数(包括一般函数和构造函数)等。

#include <iostream>
using namespace std;

struct Student {
    int number;
};    // (***)

int main() {
    Student stu;    // (*)
    struct Student stu;    // (**)
    stu.number = 10;
    cout << stu.number << endl;
};
// (*)式和(**)式编译正常,结果正常。同样,在 (***) 处声明全局变量 stu 也是没有问题的。

typedef 关键字

c++ 中的 typedef 可丰富了,可以定义任何类型的别名。当然,定义结构体类型的别名也是没有任何问题的,举例如下:

int main() {
    typedef char* PCHAR;
    PCHAR pa,pb;
    pa = "hello";
    pb = "hello";    //正常
    pb = 'h';           //报错,不能将char类型的值赋给PCHAR类型实体
    return 0;
}

参考文章:

https://www.cnblogs.com/shijingjing07/p/5591896.html

https://blog.csdn.net/a_forever_dream/article/details/88843230

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

发表评论

email
web

全部评论 (暂无评论)

info 还没有任何评论,你来说两句呐!