C/C++语法总结

3 篇文章 0 订阅

malloc,new,calloc,realloc

三者皆可开辟内存,new []是c++特有;速度malloc>new []>calloc。

  1. malloc 函数: void *malloc(unsigned int size)
    开辟空间并没有查擦写内存。
    在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。
  2. new是动态分配内存的运算符,自动计算需要分配的空间,在分配类类型的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。动态分配内置类型是否自动初始化取决于变量定义的位置,在函数体外定义的变量都初始化为0,在函数体内定义的内置类型变量都不进行初始化。
  3. calloc 函数: void *calloc(unsigned int num, unsigned int size)
    按照所给的数据个数和数据类型所占字节数,分配一个 num x size 连续的空间。
    calloc申请内存空间后,会自动初始化内存空间数据为 0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。
  4. 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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿尔发go

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值