C语言深度剖析

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就成为了野指针。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值