请注意,本文编写于 258 天前,最后修改于 258 天前,其中某些信息可能已经过时。
最近在备战某大学暑期夏令营,算法题是必不可少的一道关。由于我没怎么系统学过 C 语言和 C++(鄙人转专业),所以到现在对结构体、内存申请啥的竟然都还不熟悉,实在太羞愧和遗憾。考研、找工作这也都应该是必备技能了,所以我跺了跺脚,狠下心来用此篇文章来终结我对 C、C++ 的恐惧感。
using namespace std
是 C++ 中的语法特性,叫做命名空间,目的是为了阻止变量引用冲突;
#include stdio.h
是 C 语言的标准输入输出,#include <iostream>
是 C++ 的标准输入输出;
在 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
因为每次都需要以 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 来声明变量。而且 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 也是没有问题的。
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
全部评论 (暂无评论)
info 还没有任何评论,你来说两句呐!