C++语法学习笔记三: 范围for、new内存动态分配、nullptr

实例代码:


#include <iostream>
using namespace std;


int main() {
	//一:范围for语句:用于遍历一个序列
	int v[]{ 12,13,14,15,16,18 };

	//for (auto x : v) {  //数组v中每个元素 依次放入x中并打印x值。把v每个元素拷贝到x中,打印x值:
	for (auto &x : v) {   //省了拷贝这个动作,提高了效率
		cout << x << endl;
	}
	
	cout << "-----------------------------" << endl;

	for (auto x : {11,34,56,21,34,38}){
		cout << x << endl;  //正常输出
	}


	//二: 动态内存分配问题:
	// C++ 中,我们把内存细分为5个区域
	//(1) 栈:一般函数内的布局变量都会放到这里,由编译器自动 分配和释放。
	//(2) 堆:程序员malloc/new 分配,用free/delete来释放,忘记释放后,系统会回收。
	//(3) 全局/静态存储区:放全局变量和静态变量 static。程序结束时系统释放。
	//(4) 常量存储区:“I Love China”
	//(5) 程序代码区

	//堆和栈不同的用途和区别
	//(1)栈:空间有限,系统分配速度快,程序员也控制不了。 int a = 4;
	//(2)堆:只要不超过你实际拥有的物理内存,也在操作系统允许你能够分配的最大内存大小之内,都可以分配给你。分配速度比较慢,用malloc/new来分配,free/delete来释放。

	//malloc/free使用   malloc/free是函数

	int *p = nullptr;
	p = (int*)malloc(sizeof(int)); //在堆中分配4个字节。
	if (p != nullptr) {
		//分配成功
		*p = 5;
		cout << *p << endl;
		free(p); //释放掉,千万不要忘记
	}


	char *point = nullptr;
	point = (char*)malloc((100 * sizeof(char))); //100个位置
	if (point != nullptr) {
		strcpy_s(point,100, "hello world!");
		cout << point << endl;
		free(point);
	}


	//new /delete :是运算符(标识符)。C++中经常用new/delete分配和释放内存 
	//new /delete也和malloc/free干了一样的事就是分配和释放内存,同时new/delete 还干了更多的事。
	//new 一般使用格式:
	//(1) 指针变量名 = new 类型标识符;
	//(2) 指针类型名 = new 类型标识符(初始值); //注意这里是圆括号括起来, 表示初始值
	//(3) 指针类型名 = new 类型标识符[内存单元个数]; //注意这里是【】

	int *myint = new int;
	if (myint != nullptr) {
		*myint = 8; //*myint代表指针指向的变量
		cout << *myint << endl;
		delete myint; //释放单个myint的空间

	}

	int *pa = new int[100];// 开辟一个大小为100的整形数组空间
	if (pa != nullptr) {
		int *q = pa;
		*q++ = 12;   //[0] = 12
		*q++ = 18;   //[1] = 18 ,执行完这个,这个q其实已经指向[2]

		cout << *pa << endl; //12
		cout << *(pa + 1) << endl; // 18

		//释放内存
		delete[] pa; //释放int pa数组空间      ---- delete pa; 表示只释放pa[0]
					// new 时候我们用[] ,那么delete就必须用[]
	}


	//三:nullptr    C++ 11中引入新关键字
	//nullptr 代表的是空指针

	char *pc = NULL;// NULL 实际就是0 
	char *qc = nullptr;

	if (pc == nullptr) {
		cout << "NULL == nullptr" << endl;
	}
	if (qc == NULL) {
		cout << "qc == NULL" << endl;
	}
	//使用nullptr 能够避免在整数和指针之间发生混淆

	cout << typeid(NULL).name() << endl;  //int 
	cout << typeid(nullptr).name() << endl; //nullptr

	//NULL 和 nullptr 实际上是不同的类型,NULL是整形, nullptr 是个空指针
	//结论:对于指针的初始化,尽量使用nullptr取代NULL;

	int *myint11 = new int(18);
	if (myint11 != nullptr) {
		cout << "good2" << endl;
	}



	system("pause");
	return 0;
}


©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值