![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
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 · 324 阅读 · 0 评论 -
补充:结构体大小
为了加快对结构体成员的访问,编译器对结构体进行内存对齐,结构体大小往往大于成员字节数的总和。 结构体大小计算原则 1. 确定每个成员的字节数 2. 第一个成员在结构体偏移量为0的位置(起始下标从0开始) 3. 当前成员的偏移量是当前成员所占大小的整数倍(即当前成员的起始下标%sizeof(当前成员)== 0) 4. 结构体总大小是成员最大字节数的整数倍 struct Test { int...原创 2019-11-24 21:48:10 · 97 阅读 · 0 评论 -
十一、全局与静态
栈、堆、全局静态存储区、常量存储区 1. 栈:编译时能确定大小的变量的存储区,在函数作用域内创建,离开作用域销毁 主要是局部变量、函数参数、存储空间连续 2. 堆:编译时不能确定大小的变量的存储区 ▪ 由malloc 分配,free释放 ▪ 不释放则存在 ▪ 存储空间不一定连续 3. 全局静态存储器:编译时能确定大小,整个程序运行期间可见 主要是全局变量、静态变量 4. 常量:可确定大小,一...原创 2019-08-31 21:04:30 · 153 阅读 · 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 · 91 阅读 · 0 评论 -
九、链表
链表 1. 因为数组是静态分配存储空间,以后不能修改,链表是动态 2. 链表分为数据域和指针域 定义结构体 1. 不能这样定义,因为此时在{}内部还没有NODE typedef { char name[10]; int num; NODE *next; } NODE; 2. 无法在定义结构体时赋初值,不起作用 struct Node{ char name[10] ...原创 2019-08-31 21:02:33 · 88 阅读 · 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 · 119 阅读 · 0 评论 -
七、运算符优先级
优先级 1. !> 算术运算符(*/%+-) > 关系运算符(>>=<<===!=) > 逻辑运算符(&&||) > 赋值 2. 位运算符(~<< >> & ^ |) 3. .、[]、函数 高于 * *p.name 相当于 *(p.name) int *a[] 相当于 int *(a[]) int...原创 2019-08-31 20:59:14 · 157 阅读 · 0 评论 -
六、函数
函数参数的值传递和引用 1. 值传递:函数将参数复制一份(实参复制给形参),函数内部操作的是形参,对实参没有影响 2. 引用:函数传入的地址,实参和形参指向同一个变量 int fun(int a) { a = 2; } int fun(int *a) { *a = 2; } 数组退化为指针 当数组作为函数的参数,数组退化为指针,不能用sizeof来获取大小,此时sizeof获取的...原创 2019-08-31 20:58:15 · 99 阅读 · 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 · 118 阅读 · 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 · 95 阅读 · 0 评论 -
三、指针数组和数组指针
指针数组 是一个数组,数组里面放的是指针变量,未被赋值的元素值为0 char 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 · 141 阅读 · 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 · 69 阅读 · 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 · 122 阅读 · 0 评论 -
C语言目录
1. 数据类型 2. 指针 3. 指针数组和数组指针 4. 指针常量和常量指针 5. 函数指针 6. 函数 7. 运算符优先级 8. 结构体 9. 链表 10. 枚举类型和联合体类型 11. 全局与静态 12. 编译过程 ...原创 2019-08-31 20:43:04 · 521 阅读 · 0 评论