C基础学习笔记

C语言基本数据类型

  • char 1字节(不能表示汉字)
  • short 2字节
  • int 4字节
  • long 4字节(很长的数字可以用longlong)
  • float 4字节
  • double 8字节
  • signed (只能用来修饰整型)
    • 整型默认是为signed
  • unsigned (只能用来修饰整型)
  • void (不能直接定义变量,但是可以定义一个指针)
    • void* 可以指向任意一个对象

注意:

  1. C语言是没有byte和boolean类型的(0表示false,非0表示true)
  2. 【字符串】申明1:char* str = “你好,C”
  3. 【字符串】申明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个字节(取决于指针变量的类型所占的字节数)
  • 若函数的参数为指针变量,且在函数内要修改该指针变量的地址值,那么函数的参数要申明为二级指针,否则修改将不成功

注意:

  1. 野指针是不能直接赋值的
  2. 指针类型申明与值对应的内存地址类型要一致,否则值会出错,比如:
    double i = 3.14; int* pointer = &i; 这样再通过 *pointer取值时就会出错,必须使用 double* point进行声明
  3. 一个指针变量所占内存大小: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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值