malloc,new,calloc,realloc
三者皆可开辟内存,new []是c++特有;速度malloc>new []>calloc。
- malloc 函数: void *malloc(unsigned int size)
开辟空间并没有查擦写内存。
在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。 - new是动态分配内存的运算符,自动计算需要分配的空间,在分配类类型的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。动态分配内置类型是否自动初始化取决于变量定义的位置,在函数体外定义的变量都初始化为0,在函数体内定义的内置类型变量都不进行初始化。
- calloc 函数: void *calloc(unsigned int num, unsigned int size)
按照所给的数据个数和数据类型所占字节数,分配一个 num x size 连续的空间。
calloc申请内存空间后,会自动初始化内存空间数据为 0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。 - realloc 函数: void *realloc(void *ptr, unsigned int size)
动态分配一个长度为size的内存空间,并把内存空间的首地址赋值给ptr,把ptr内存空间调整为size。
申请的内存空间不会进行初始化。
都是在 堆区 分配内存的
-
malloc 只申请内存,不初始化
-
malloc 可以用于任何类型的分配
-
calloc申请内存并初始化所有位为 0
-
calloc主要用于数组类型的分配
-
malloc 执行效率要高于 calloc
-
C :malloc 、calloc
-
C++ :new
new 是 c++ 中用来在 堆区 分配内存的,它跟 malloc 一样 不会初始化所有位 且执行效率几乎一致,但是,它会调用对应数据类型的构造函数。
其次,使用 malloc 、calloc、new 分配的内存,都可以使用 delete 来释放,如果要遵循 C 写法,请使用 free 函数。
tips: 不要使用 free 函数去释放由 new 分配的内存。
- free 是 C 语言 API ,主要用来释放由 malloc 和 calloc 分配的内存
- free 也可以释放 由 new 分配的内存,但是 不推荐使用,因为它不会去触发new的析构函数
- delete 是 C++ 关键字,主要用来释放由 new 分配的内存
- delete 也可以用来释放由 malloc 和 calloc 分配的内存
在 C++ 中虽然可以使用 delete 替代 free 但是,还是建议搭配使用为好。
const关键字
声明指针时,可以在类型前或后使用关键字const,也可在两个位置都使用。例如,下面都是合法的声明,但是含义大不同:
const int * pOne; //指向整形常量 的指针,它指向的值不能修改
int * const pTwo; //指向整形的常量指针 ,它不能在指向别的变量,但指向(变量)的值可以修改。
const int *const pThree; //指向整形常量 的常量指针 。它既不能再指向别的常量,指向的值也不能修改。
理解这些声明的技巧在于,查看关键字const右边来确定什么被声明为常量 ,如果该关键字的右边是类型,则值是常量;如果关键字的右边是指针变量,则指针本身是常量。下面的代码有助于说明这一点:
const int *p1; //the int pointed to is constant
int * const p2; // p2 is constant, it can't point to anything else
union/struct/位段的组合使用
实现不同bit位的多个逻辑寄存器的使用,仅支持signed int或unsigned int类型变量
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
union IPEnable{
unsigned int data;
struct {
unsigned int rand_en : 1;
unsigned reg_mode : 3;
signed int layout_mode : 3;
signed c : 3;
unsigned resvered : 22;
}reg;
};
union IPReg1{
unsigned int data;
struct {
unsigned aa : 1;
unsigned bb : 3;
unsigned cc : 2;
unsigned resvered : 26;
}reg;
};
int main(void)
{
unsigned int cfg;
union IPEnable En;
union IPReg1 Reg1;
cfg = 1;
En.reg.rand_en = cfg;
cfg = 1;
En.reg.reg_mode = cfg;
cfg = 3;
En.reg.layout_mode = cfg;
cfg = 7;
En.reg.reg_mode = cfg;
cfg = 12;
En.reg.reg_mode = cfg;
Reg1.data = cfg;
return 0;
}
数据类型对应字节数
常用数据类型对应字节数
可用如sizeof(char),sizeof(char*)等得出
32位编译器:
char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
64位编译器:
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节
C语言实现函数重载
https://blog.csdn.net/gatieme/article/details/50921577