C语言知识点总结篇
Debug和Release版本比较
- Debug附加了许多调试信息,主要用于调试,故文件大;
- Release是经过优化后的版本,去掉了调试信息,代码进行了优化,故文件较小,且编译速度快过Debug,用于发布平台的配置管理器的设置;
32位与64位
- 32位,地址为32位,最大使用内存4G,只能运行32位的数据;
- 64位,地址为64位,既可以运行32位的数据,也可以运行64位的数据;
指针
- 指针是个量,对应一块内存区域;
- 指针存储的是某个内存单元的地址;
- 访问方式:
1、直接访问:按变量地址存取变量值,取地址符&;
2、间接访问:通过存放变量地址的变量去访问变量,间接运算符*; - 在函数中改变一个外部变量,需要变量的地址;
- 若是数据,需要指向数据的指针存储数据的地址;
- 若是指针,需要指向指针的指针存用户指针的地址;
数组与指针
- p[i]等价于*(p+i),&p[i]等价于p+i;
- a[i][j]等价于*(*(a+i)+j),&a[i][j]等价于*(a+i)+j, a[i]等价于*(a+i);
- 行数组指针定义方法:数据类型(*指针变量名)[二维数组列数];
- 二维数组地址不可变化,数据可以变化,可以在不修改地址的情况下管理数据,指针数组指向的数据不可变化,但地址可以变化,在不修改数据的情况下查看数据;
- 三维数组与指针,A[i][j][k]的三种表达形式:*(A[i][j]+k)、*(*(A[i]+j)+k)、*(*(*(A+i)+j)+k);
函数与指针
- 若在程序中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址,称为这个函数的指针,int(*p)(int, int),代表定义p是指向函数的指针变量,可以指向类型为整形且有两个整形参数的函数;
- 定义返回值为指针值的函数的一般形式:类型名 *函数名(参数列表);
malloc和free函数
- 动态内存分配,无法知道内存具体位置时,想要绑定真正的内存空间,则要用到动态分配内存,原型为extern void* malloc(unsigned int size),空指针可以转换为任何类型的指针,size仅仅是申请字节的大小,并不管申请的内存块中存储的数据类型,故申请内存的长度需通过“长度 x sizeof(类型)”的方式给出,使用完之后要用free释放内存;
- 一个类型的指针包含三个信息:地址、步长、内容如何解析;
- 在栈区开辟一段内存,系统会自己回收,在堆区开辟一段内存,需要手动用free释放;
calloc和realloc函数
- calloc原型:void* calloc(unsigned int num,unsigned int size),num:对象个数,size:对象占据的内存字节数,功能是为已经分配的内存重新分配空间并复制内容,会自动将内存初始化为0;
- realloc原型:voidrealloc(void ptr,unsigned int size),ptr:已分配的内存地址,size:重新分配的字节数
内存分区
- C/C++中,内存分为:堆、栈、自由存储区、全局/静态存储区、常量存储区;
- 堆:由new分配的内存块,一般对应一个delete,若没用释放,则程序结束后操作系统自动回收;
- 栈:编译器需要的时候分配,不需要时自动清楚的变量的存储区,通常是局部变量、函数参数等;
- 自由存储区:由malloc等分配的内存块,必须用free释放;
- 全局存储区:全局变量和静态变量的存储区域,未初始化的两者在相邻存的另一块区域,程序结束后自动释放;
- 常量存储区:存放常量,不可修改;
sizeof和strlen
- 实例
#include <iostream>
#include <string.h>
int main()
{
char str[10] = "hello";
cout << sizeof(str) <<endl << sizeof("hello")<< endl << str(str)<< endl;
system("pause");
return 0;
}
- 结果:

- 结论:对一个数组字符串,sizeof不管是否初始化,只输出其预留内存大小,而strlen()输出初始化后的字符串所占内存大小,不含'\0';
gets和scanf
- gets遇到换行符表示结束,而scanf遇到空格、制表符、换行则表示结束;
Unicode字符问题
- char字符串可显示汉字,但字符不可以,字符连在一起用%c%c可以输出一个汉字;
结构体
- 结构体引用方式:结构体数组名[下标].成员名;
- 结构体指针变量引用成员形式:(*结构体指针名).成员名、结构体指针名->成员名、结构体变量名.成员名;
结构体字节对齐机制
- 结构体变量大小是能够被其最宽基本类型成员的大小所整除;
- 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,若有需要编译器会在成员之间加上填充字节;
- 结构体总大小为结构体最宽基本类型成员大小的整数倍,若有需要编译器会在最末一个成员之后加上填充字节;
共同体union
- 使几个不同类型的变量共占一段内存(相互覆盖),长度=最长成员所占字节数,不能同时对所有成员初始化;
深拷贝与浅拷贝
- 深拷贝:根据指针指向的值,重新申请内存,再以此将指针指向内容复制过来,有相互独立的内存空间,一般复制构造函数和strcpy等函数都是深拷贝;
- 浅拷贝:把对象(结构)里的值完全复制给另一个对象(结构),对于地址也是照抄,类的默认复制构造函数是将类中非静态成员变量逐个复制,是浅拷贝;
文件分类
按逻辑
- 记录文件:具有一定结构的记录组成(定长和不定长);
流式文件:由一个个字符(字节)数据顺序组成;
按存储介质
- 普通文件:存储介质文件(磁盘、磁带等);
设备文件:非存储介质(键盘、显示器、打印机等);
按数据组织形式
- 文本文件:ASXII文件,每个字节存放一个字符的ASCII码;
二进制文件:数据按其在内存中的存储形式原样存放;
文件处理方法
- 缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区和非缓冲文件系统;
- 低级文件系统:由用户在程序中为每个文件设定缓冲区;
fscanf和fprintf函数
- 两者遇到空格或换行时结束;
文件型结构体
struct _iobuf
{
char *_ptr;//当前缓冲区内容指针
int _cnt;//缓冲区还有多少个字符
char *_base;//缓冲区的起始地址
int _flag;//文件流的状态,是否错误或者结束
int _file;//文件描述符
int _charbuf;//双字节缓冲,缓冲2个字节
int _bufsiz;//缓冲区大小
char *_tmpfname;//临时文件名
};
fopen打开模式
- 只读模式"r"打开文件,该文件必须存在,否则打开失败,r+,rb,rb+,rt,rt+模式打开文件,文件不存在也会失败;
- 只写模式"w"打开,文件存在则长度清0,不存在则建立文件,w+,wb,wb+,wt,wt+模式打开文件,文件不存在则建立文件;
- a以附加的方式打开只写文件,若文件不存在,则建立文件,存在则在文件尾部添加数据,a+以附加的方式打开可读写文件,不存在则建立文件,存在则写入数据到文件尾,at二进制数据的追加,不存在则创建,只能写、at+读写打开一个文本文件,允许读或在文本末追加数据,ab二进制数据的追加,不存在则创建,只能写;
阻塞模式和非阻塞模式
- 非阻塞模式,会引起宕机,会一直执行;
system("start notepad");
- 阻塞模式,不会引起宕机,执行一步后才能执行下一步;
system("notepad");
欢迎关注微信公众号:村雨1943;创作不易,未经同意,转载请注明出处~
C语言知识点总结篇的更多相关文章
- C语言知识点复习梳理
C语言知识点复习梳理 C语言的知识点讲完了,接下来就是做一下整理与总结,然后就会进入其他知识的学习. 本文目录如下: 基础知识. 顺序程序设计. 数据类型. 标准输入输出. 进制转换. 选择结构. 循 ...
- [iOS]C语言知识点系列视频
C语言知识点系列视频 目录 C语言技术视频-01-变量的定义 C语言技术视频-02-程序分支结构(if...else) C语言技术视频-03-程序分支结构(switch) C语言技术视频-04-程序循 ...
- Scala语言笔记 - 第一篇
目录 Scala语言笔记 - 第一篇 1 基本类型和循环的使用 2 String相关 3 模式匹配相关 4 class相关 5 函数调用相关 Scala语言笔记 - 第一篇 最近研究了下scala ...
- 快速上手系列-C语言之指针篇(一)
快速上手系列-C语言之指针篇(一) 浊酒敬风尘 发布时间:18-06-2108:29 指针的灵活运用使得c语言更加强大,指针是C语言中十分重要的部分,可以说指针是C语言的灵魂.当然指针不是万能的,但没 ...
- 知识点:C语言进阶提高篇,自定义数据类型:枚举
一.枚举的概念 枚举是C语言中的一种基本数据类型,并不是构造类型,它可以用于声明一组常数.当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型.比如,你可以用一个枚举类型的变量来表示季节,因 ...
- 知识点回顾——C语言知识点复习梳理,看看你是不是都完全掌握了
前段时间,我分享了关于C语言的一些必备知识点,感兴趣的朋友可以查看我的往期文章,或是关注公众号c语言进阶之路,查看次条文章,或搜索关键字"编程小白基础必备",就能查看相关文章了. ...
- 瘋子C语言笔记(指针篇)
指针篇 1.基本指针变量 (1)定义 int i,j; int *pointer_1,*pointer_2; pointer_1 = &i; pointer_2 = &j; 等价于 i ...
- 深入研究C语言 第三篇
本篇研究TC2.0下其他几个工具.同时看看TC由源代码到exe程序的过程. 1. 用TCC将下面的程序编为.obj文件 我们知道,TCC在默认的编译连接一个C语言的源程序a.c的时候分为以下两步: ( ...
- C语言知识点总结
本文采用思维导图的方式撰写,更好的表述了各知识点之间的关系,方便大家理解和记忆.这个总结尚未包含C语言数据结构与算法部分,后续会陆续更新出来,文中有漏掉的知识点,还请大家多多指正.
随机推荐
- webpack报错
webpack-dev-server --inline --progress --config build/webpack.dev.conf.js internal/modules/cjs/loade ...
- javascript字符串加密解密函数
代码如下: /** * 加密函数 * @param str 待加密字符串 * @returns {string} */ function str_encrypt(str) { var c = Stri ...
- Android 自定义ListView动态加载数据
我们都知道网络取数据是耗时操作,如果我们一次性请求所有数据,假如数据量不多那还可以接受,但是如果数据量特别多,那么带来的后果就是用户的愤怒(用户是很没有耐心的),所以这时候我们就需要动态的加载数据,分 ...
- Linux shell sed命令使用
Linux处理文本文件的工具: grep 过滤文件内容 sed 编辑文件内容 awk 正则表达式Regex ...
- Linux内存含义
关于Linux的内存,首先要先知道各个部分的含义 1. 命令: free -m // Mb 显示 1,total:物理内存实际总量2,used:这块千万注意,这里可不是实际已经使用了的内存哦 ...
- cocoapods升级
1.更新gem:sudo gem update --system 先要查看下源,如果源被墙了就换地址:https://gems.ruby-china.com 1.1.删除gem源:gem source ...
- Huawei S系列交换机 Easydeploy 特性
参考 HW S2750, S5700, S6720 V200R008C00 配置指南-基础配置-EasyDeploy配置 原理,DHCP&TFTP部署等 四. HW EasyDeploy HW ...
- Python面试题(4)
1.Python下多线程的限制以及多进程中传递参数的方式 Python多线程有个全局解释器锁,这个锁的意思是任一时间只能有一个线程运用解释器.并发不是并行. 多进程间同享数据,能够运用multipro ...
- 201871010117-石欣钰《面向对象程序设计(java)》第二周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- C#中的函数(一) 无参无返回值的函数
分析下C#中的函数 先写一个小例子,一个静态函数,无返回值,无形参 在第17行与20行分别下断点 F5调试运行,此时中断在第17行MyFunction(), 在第17行右键反汇编,看下反汇编代码 这里 ...