1、指针和数组变量的区别
#include
输出:
output:
15
8
0x7fff5ab94af5
0x7fff5ab94af5
0x7fff5ab94af5
0x7fff5ab94ae8
- printf("%pn", s); 与 printf("%pn", t); 相同可以看出 数组变量可以被当做指针使用 ,并指向数组在存储器中的 起始地址 。
- 对于sizeof运算,当参数为数组变量时,会自动计算对应的数组长度而非指针长度(其实就是这个数据类型所占的字节大小)。
- 对于数组变量取地址仍然为数组的起始地址:&s == s ==&s[0] 值相同但含义不同
- 数组变量不能指向其他地方(数组名是个常量),但创建指针变量的时候计算机会为它分配存储空间。实际上计算机只会为数组分配存储空间, 但不会为数组变量分配任何存储空间 ,编译器会在数组变量出现的地方将它替换成数组的起始地址。
2、C语言中指针+1运算
好文:详解:C语言中的指针和p, p+1, *(p+1), *P+1, p[0], &p[0] 的含义
注意:*p++ //先解引用,然后p的地址自增(与P指向的对象无关)
注意:p=NULL 和p=0 或 p='0' 等价
3、二维数组
二维数组可以形象的看作为用行指针、列指针来操作
行指针前+* = 列指针
列指针前+& = 行指针
p[n] == *(p+n)
p[n][m] == *( *(p+n)+ m )
4、C语言函数不定参数实现方式
好文:C语言函数不定参数实现方式
5、const关键字
#include
6、字节对齐
//字节对齐 原则;
好文:#pragma pack()用法详解
7、大小端问题 Little-Endian Big-Endian
//大小端 + 联合体
好文:C语言之大小端详解_C/C++_qq_39412582的博客-CSDN博客
8、文件操作
文件操作
r 可读权限 文件必须存在 若不存在打开失败报错
r+ 可读可写权限 文件必须存在 若文件不存在打开失败报错
w 可写权限 不允许文件读出 若文件不存在 创建文件
w+ 可读可写文件 若文件不存在 创建文件
a 以附加方式打开可写的文件 若文件存在 则会在文件末尾进行数据写入 若文件不存在 创建文件
a+ 以附加方式打开可读可写的文件 若文件存在 则会在文件末尾进行数据写入 若文件不存在 创建文件
//文件操作 注意在同一个文件中不要同时进行读写操作(文件在读写时候文件流会移动)
好文:C语言文件读写操作总结 - home普通的人 - 博客园
9、段错误快速定位
1、 编译时gcc 1.c -g ,后边加上-g
2、 运行时./a.out,产生段错误时会自动生成core.xxxx的文件
(若没有产生这个文件,则在命令行输入ulimit -c umlimited,重新编译运行)
3、 用gdb调试 gdb a.out core.xxxx
4、 输入where查看详细信息,既可以定位段错误的位置
10、++i、i++
++i 先运算,再显示值
i++ 先显示,再运算
11、程序的终止及atexit函数详解
好文:程序的终止及atexit函数详解_C/C++_honeyJ-CSDN博客
12、三目运算
好文:三目运算符详解 - 鸿燕藏锋 - 博客园
对上文中第7点不甚了解,看不出来区别
13、指针
好文:C语言指针详解 - lulipro - 博客园
指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。
为什么需要指针?
第一,指针的使用使得不同区域的代码可以轻易的共享内存数据。
第二,指针使得一些复杂的链接性的数据结构的构建成为可能,比如链表,链式二叉树等等。
第三,有些操作必须使用指针。如操作申请的堆内存。
第四,C语言中的一切函数调用中,实参传递给形参的机理都是“按值传递(pass by value)”的,如果我们要在函数中修改被传递过来的对象,就必须通过这个对象的指针来完成。
//1) 一个有10个指针的数组,该指针是指向一个整型数的;
14、类型限定符
好文:C语言类型限定符
15、函数指针
#include
16、数组指针array pointer 指针数组 pointer array
int
指针数组(也就是元素为指针类型的数组)常常作为二维数组的一种便捷替代方式。一般情况下,这种数组中的指针会指向动态分配的内存区域。
//例如,如果需要处理字符串,可以将它们存储在一个二维数组中,
17、 动态内存分配
两个内存分配函数 malloc()和 calloc()的参数不一样:
void*malloc(size_t size);
函数 malloc()分配连续的内存区域,其大小不小于 size。当程序通过 malloc()获得内存区域时,内存中的内容尚未决定。
void*calloc(size_t count,size_t size);
函数 calloc()分配一块内存区域,其大小至少是 count_size。换句话说,上述语句分配的空间应足够容纳一个具有 count 个元素的数组,每个元素占用 size 个字节。而且,calloc()会把内存中每个字节都初始化为 0。
18、应用
好文:C语言中引用的用法_C/C++_小米mm修仙路-CSDN博客
指针和引用的区别
相同点:
1)都是地址的概念,指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。
区别:
1)指针是一个实体,而引用仅是个别名;
2)引用使用时无需解引用(*),指针需要解引用;
3)引用只能在定义时被初始化一次,之后不可变;指针可变;
5)引用不能为空,指针可以为空;
6)“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
7)指针和引用的自增(++)运算意义不一样;
8)从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。
19、 C语言编译
四个步骤
一、预处理阶段
展开头文件,宏替换,条件编译,去掉注释
二、编译阶段
检查语法错误,生成汇编代码
三、汇编阶段
把汇编代码转换成二进制机器码
四、链接阶段
将所有机器码链接在一起,生成可执行程序
20、 判断float类型数据与某个值是否相等
float类型数据的比较我们不能使用"=="、"!="等确定性的判别,必选要转换为">="、"<="等判别式
例如:判别float a是否为0
#include
21、链表
好文:【链表】链表常见笔试题和面试题(C语言)_C/C++_HongKnight的博客-CSDN博客
好文:数组和链表的区别浅析_网络_我的博客-CSDN博客
好文:判断一个链表是不是循环链表 - xshang - 博客园
22、为什么在定义结构体时成员变量不能赋初值?
TODO
22、声明和定义的区别?
TODO
23、回调函数深入理解
好文:回调函数(callback)是什么?