C语言常用知识点总结(重要)
指针与数组,指针与函数?
数组是用于存储多个相同类型的集合
指针是变量,存放的是其他变量在内存中的地址
区别:
赋值:数组不可以直接相互复制,只能数组中的每个元素依次赋值或者拷贝
指针可以相互赋值
表示范围:数组的有效范围就是某个空间的范围
指针可以指向任意地址
sizeof单目运算符:数组所占的内存大小:sizeof(数组名)
数组的大小:sizeof(数组名)/sizeof(数据类型)
指针所有的sizeof 对于32位平台:均占有四个字节
对于64位平台:均占有八个字节
指针数组与数组指针
指针数组:是一个数组,数组的元素是指针。int *qishou[2] 指针数组
数组指针:是一个指针变量,指针变量指向数组。int (*p)[3] 数组指针
对于数组指针的访问形式1.数组法 ; 2.指针法
数组法:*(p)[j] 指针法:*((*p)+j)
C语言将数组进行传参时将进行退化
在传递整个数组作为函数参数时,将数组名看作是常量指针
局部变量和全局变量是否可以重名?
可以,作用域的问题,
但是如果是在C++里面使用全局变量需要使用"::"来区分
如何引用一个已经定义过的全局变量?
已经定义的全局变量使用extern关键字来进行声明
全局变量和静态全局变量的区别?
static把全局变量的作用域减少了
当一个源程序由多个源文件组成时,非静态全局变量对各个源文件有效,静态成员变量则仅限于同一个源文件内。
Const和Define的区别?
编译器处理的方式不同:
define是在预处理阶段展开
const常量是在编译运行阶段使用
类型和安全检查(const的安全性更高)
define宏没有类型,当然也不做类型检查,define在预编译阶段就已经完成替换,所以也后续不能进行调试
const有具体的类型,执行更严格的类型检查,此外const也可以调试,
const修饰的变量存放在只读存储区,可以节省开销
常量折叠
存储方式不同
宏仅是展开,不分配内存
const在程序运行过程中有一次备份,占用数据段
指针和数组在strlen和sizeof中的大小计算?
strlen()函数接收的参数是指针,计算数组长度时不需要算上**‘\0’**,但是是需要遇到末尾的’\0’才结束
int main()
{
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//代表整个二维数组大小
printf("%d\n", sizeof(a[0][0]));//代表第一行第一个元素
printf("%d\n", sizeof(a[0]));//代表第一行元素总大小
printf("%d\n", sizeof(a[0]+1));//代表第一行第一个元素的地址跳过一个整型后的地址
printf("%d\n", sizeof(*(a[0]+1)));//代表第一行第二个元素解引用后的类型大小
printf("%d\n", sizeof(a+1));//代表首元素地址(即第一行地址) + 1 - 即第二行地址
printf("%d\n", sizeof(*(a + 1)));//代表*(a+1) <=> a[1],第二行元素总大小
printf("%d\n", sizeof(&a[0]+1));//&a[0]代表取出第一行的地址,+1代表取出第二行的地址
printf("%d\n", sizeof(*(&a[0] + 1)));//解引用,计算的是第二行
printf("%d\n", sizeof(*a));//代表对第一行地址解引用,计算的是第一行元素总大小
printf("%d\n", sizeof(a[3]));
return 0;
}
sizeof和strlen的区别
sizeof是C语言中的一个单目运算符,用来计算数据类型所占空间的大小,单位为字节;在编译时起作用而不是运行时,没有规定具体的类型
而strlen是一个函数,用来计算字符串长度。使用时需要引用头文件 #include<string.h>,标准库函数
指针变量所占的空间大小为四个字节(32位系统)或者八个字节(64位系统)