
c陷阱
onj123
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
补充:字符串与二维数组与二级指针与函数参数
字符串与数组、指针1. 一维数组、指针对于字符串“ABCD”一维数组:char str[] = "ABCD"; 或者 char str[] = {'A', 'B', 'C', 'D', '\0'}; 或者 char str[5] = {'A', 'B', 'C', 'D', '\0'};指针:char *p = "ABCD"; 或者 char *p = str;2. 二维数组、二维...原创 2019-11-24 21:49:39 · 377 阅读 · 0 评论 -
补充:结构体大小
为了加快对结构体成员的访问,编译器对结构体进行内存对齐,结构体大小往往大于成员字节数的总和。结构体大小计算原则1. 确定每个成员的字节数2. 第一个成员在结构体偏移量为0的位置(起始下标从0开始)3. 当前成员的偏移量是当前成员所占大小的整数倍(即当前成员的起始下标%sizeof(当前成员)== 0)4. 结构体总大小是成员最大字节数的整数倍struct Test { int...原创 2019-11-24 21:48:10 · 140 阅读 · 0 评论 -
十一、全局与静态
栈、堆、全局静态存储区、常量存储区1. 栈:编译时能确定大小的变量的存储区,在函数作用域内创建,离开作用域销毁主要是局部变量、函数参数、存储空间连续2. 堆:编译时不能确定大小的变量的存储区 ▪ 由malloc 分配,free释放 ▪ 不释放则存在 ▪ 存储空间不一定连续3. 全局静态存储器:编译时能确定大小,整个程序运行期间可见主要是全局变量、静态变量4. 常量:可确定大小,一...原创 2019-08-31 21:04:30 · 213 阅读 · 0 评论 -
十、枚举和联合体
枚举类型1. 枚举值是常量,枚举变量的值只能是枚举值列表中的一个。2. 可以给常量符号赋值,赋值后,从被赋值哪个常量开始依次加1,如果没有赋值从0开始enum COLOR {a,b,c=5,d} color;color = a;// color = 0;color = (COLOR)0;printf("%d\n", color);联合体所有数据共用一个空间(空间大小为最大成员所...原创 2019-08-31 21:03:35 · 129 阅读 · 0 评论 -
九、链表
链表1. 因为数组是静态分配存储空间,以后不能修改,链表是动态2. 链表分为数据域和指针域定义结构体1. 不能这样定义,因为此时在{}内部还没有NODEtypedef { char name[10]; int num; NODE *next;} NODE;2. 无法在定义结构体时赋初值,不起作用struct Node{ char name[10] ...原创 2019-08-31 21:02:33 · 122 阅读 · 0 评论 -
八、结构体
结构体定义1. 先声明再定义struct student { int a;};struct student t1;2. 声明定义一起struct student { int a;} t1;3. 定义结构体类型typedef struct student { int a = 0;} STUDENT;STUDENT t1;结构体大小计算1. 空结构体...原创 2019-08-31 21:00:00 · 166 阅读 · 0 评论 -
七、运算符优先级
优先级1. !> 算术运算符(*/%+-) > 关系运算符(>>=<<===!=) > 逻辑运算符(&&||) > 赋值2. 位运算符(~<< >> & ^ |)3. .、[]、函数 高于 **p.name 相当于 *(p.name)int *a[] 相当于 int *(a[])int...原创 2019-08-31 20:59:14 · 203 阅读 · 0 评论 -
六、函数
函数参数的值传递和引用1. 值传递:函数将参数复制一份(实参复制给形参),函数内部操作的是形参,对实参没有影响2. 引用:函数传入的地址,实参和形参指向同一个变量int fun(int a) { a = 2;}int fun(int *a) { *a = 2;}数组退化为指针当数组作为函数的参数,数组退化为指针,不能用sizeof来获取大小,此时sizeof获取的...原创 2019-08-31 20:58:15 · 142 阅读 · 0 评论 -
五、函数指针
函数指针指向函数的指针// 定义函数int fun(int a, int b) {return a + b;}1. 直接定义// 定义函数指针p(有两个int参数,返回值是int类型)int (*p)(int, int);// 函数指针赋值p = fun;// 调用int sum = (*p)(1,2);printf("%d\n", sum);2. 定义函数指针类型...原创 2019-08-31 20:56:20 · 158 阅读 · 0 评论 -
四、指针常量和常量指针
指针常量指针是一个常量,不可改变指针的地址,可以改变指针指向的内容char * const p;int a = 100;int b = 200;int * const p = &a;*p = 200;// p = &b;printf("%d\n", *p);常量指针是一个指针,指向常量的指针,内容不可更改,指针可以修改int a = 100;int b =...原创 2019-08-31 20:55:27 · 122 阅读 · 0 评论 -
三、指针数组和数组指针
指针数组是一个数组,数组里面放的是指针变量,未被赋值的元素值为0char a = 1;char b = 2;char c = 3;char *p[4] = {&a, &b, &c};for(int i=0; i<4; i++){ if(p[i] != 0) { printf("%d %d\n", p[i], *p[i]); ...原创 2019-08-31 20:54:10 · 180 阅读 · 0 评论 -
二、指针
指针定义:用一个变量存放另一个变量的地址,指针即地址char *p;char:p指向的地址的数据的类型char *:指针类型p:指针(即地址)指针大小sizeof§ 固定为4字节void 空类型1. 指针转空类型指针类型无需强制类型转换int a = 10; int *b = &a; void *p =b;2. 空类型指针类型转为具体类型需强制类型转换3. ...原创 2019-08-31 20:52:15 · 107 阅读 · 0 评论 -
一、数据类型
数据溢出数据超出最大值后得到最小值,超出最小值后得到最大值,本质上是字节数的限制。char:1字节,short:2字节,int:4字节,unsigned int:4字节,long:4字节,long long:8字节,float:4字节,double:8字节无符号数据范围:0至2^(字节数8)有符号数据范围:-2(字节数*8-1)+1至2(字节数8-1)printf("char=%d sh...原创 2019-08-31 20:50:17 · 200 阅读 · 0 评论 -
C语言目录
1. 数据类型2. 指针3. 指针数组和数组指针4. 指针常量和常量指针5. 函数指针6. 函数7. 运算符优先级8. 结构体9. 链表10. 枚举类型和联合体类型11. 全局与静态12. 编译过程...原创 2019-08-31 20:43:04 · 582 阅读 · 0 评论