C语言基本数据类型
- char 1字节(不能表示汉字)
- short 2字节
- int 4字节
- long 4字节(很长的数字可以用longlong)
- float 4字节
- double 8字节
- signed (只能用来修饰整型)
- 整型默认是为signed
- unsigned (只能用来修饰整型)
- void (不能直接定义变量,但是可以定义一个指针)
- void* 可以指向任意一个对象
注意:
- C语言是没有byte和boolean类型的(0表示false,非0表示true)
- 【字符串】申明1:char* str = “你好,C”
- 【字符串】申明2:char[] str = “你好,C”
指针操作
- 一级指针变量声明:int* pointer; double* d_pointer;
- 二级指针变量声明:int** pointer; (只能用来保存一级指针变量的地址,多级指针以此类推)
- 取变量指针值(&):int* pointer = &i;
- 修改指针变量所指向的内存值:*pointer = 123;
- 函数返回多个值可以通过指针来实现(就是采用引用传递)
- 字符串申明:char* str = “你好,C” (注意在printf时,取变量值不能加 *str,直接使用str)
- 指针变量做加1加2这样的操作,是将指针值挪动n个字节(取决于指针变量的类型所占的字节数)
- 若函数的参数为指针变量,且在函数内要修改该指针变量的地址值,那么函数的参数要申明为二级指针,否则修改将不成功
注意:
- 野指针是不能直接赋值的
- 指针类型申明与值对应的内存地址类型要一致,否则值会出错,比如:
double i = 3.14; int* pointer = &i; 这样再通过 *pointer取值时就会出错,必须使用 double* point进行声明 - 一个指针变量所占内存大小:32位程序占4byte,64位程序占8byte
内存
栈内存
- 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
- 函数的return语句,注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。
堆内存
TODO
静态内存
TODO
结构体
1.如何定义
关键字: struct (类似java中的class)
struct Student {
short age;
int score;
};
2.如何申明与使用
struct Student {
short age;
int score;
};
main() {
struct Student stu = {18, 100};
printf("分数:%d", stu.score);
}
3. 结构体所占内存
- 结构体大小 >= 结构体中每一个变量所占字节数的和
- 结构体大小 = 结构体中占用最大那个变量的整数倍(进行内存对齐, 为方便位运算)
4. C的结构体中不能定义函数
- C的结构体中不能定义函数, 但是可以通过函数指针进行定义
- 定义规则: 返回值(*函数指针变量名称)(参数)
void study() {
printf("day day up!");
}
struct Student {
short age;
int score;
void(*study_pointer)();
};
main() {
struct Student stu;
stu.study_pointer = &study;
stu.study_pointer();
}
5. 间接引用运算符
- 符号: ->
- 作用: 使用该运算符可以让结构体指针变量直接调用结构体中的元素
struct Student {
short age;
int score;
}
main() {
struct Student stu = { 18, 100 };
struct Student* stu_pointer = &stu;
printf("分数:%d", stu_pointer -> score); // 间接引用运算符
printf("分数:%d", (*stu_pointer).score); // 普通调用
}
联合体
- 关键字: union
- 作用: 若有一个值有时可能是一种数据类型,有时为另一种数据类型, 那么此时就可以使用到联合体, 达到节省内存的作用
- 内存占用: 为该联合体中所占内存最大的类型, 如案例中占4字节(取最大占用int类型的字节数)
union result {
int code;
char flag;
}
main() {
union result r;
r.code = 1;
printf("%d", r.code);
}
枚举
enum MyEnum {
ONE, TWO
};
main() {
enum MyEnum e = ONE;
printf("%d", e); // 0
}
自定义类型
- 关键字: typedef
- 作用: 给变量取个别名
typedef struct Student {
short age;
int score;
} stud;
main() {
stud stu = { 18, 100 };
printf("分数:%d", stu.score);
}