C语言深度剖析
1,编译器通常不为普通const只读变量分配存储空间,而是将他们保存在符号表中,使得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率更高。
2,const int *p;//p可变,p指向的对象不变。
int const *p;//p可变,p指向的对象不可变;
int * const p;//p不可变,p指向的对象可变;
const int * const p;//指针p和p指向的对象都不可变。
方法是先忽略类型名,看const靠哪个近;
3,空结构体的大小为1,编译器为每个结构体类型数据至少预留1个字节的空间。
4,柔性数组成员允许结构体中包含一个大小可变的数组,sizeof返回的这种结构大小不包含柔性数组的内存,包含柔性数组成员的结构用malloc函数进行内存的动态分配,并且分配的内存应该大于结构的大小
以适应柔性数组的预期大小。struct st{int i;int a[0]或a[]};sizeof(st)=4;不包含柔性数组的大小;struct st *p=(struct st*)malloc(sizeof(st)+100*sizeof(int));
5,一个union只配置一个足够大的空间以容纳最大长度的数据成员。
6,#pragma comment(lib,"user32.lib");该命令将user32.lib库文件加入到本工程中
7,一个基本的数据类型(包含结构体等自定义类型)加上*号后就构成了一个指针类型,这个指针的大小是一定的域*前的数据类型无关。*前的数据类型只是说明指针所指向的内存里存储的数据类型。
8,sizeof(a[max]):求数组最后一个元素的大小,虽然不存在,但sizeof是关键字在编译时求值,所以并不真正访问数组而是根据数组元素的类型确定大小。
9,&a[0]和&a虽然值一样但意义不一样。前者是数组首元素的首地址而后者是数组的首地址。
10,无法把指针变量本身传递给一个函数。
11,内存简单的分为静态区,栈,堆;
静态区:保存自动全局变量和static变量(static包含全局和局部变量),静态区的内容在总个程序的生命周期都存在,在编译的时候分配。
栈:保存局部变量,栈上的内容只在函数的范围内存在,自动销毁,效率高,空间大小有限。
堆:有malloc系列函数或new操作符分配的内存。
12,malloc函数返回值是一个void 类型的指针。free函数之后指针变量p本身保存的地址并没有改变,需要重新初始化为null,如果不null就成为了野指针。
C语言深度剖析
最新推荐文章于 2024-09-20 19:37:18 发布