实例代码:
#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;
}