学习C++趟过的坑

整理一些C++的易混淆的知识点给大家:
(适合新手学习)

1、使用 pow sqrt 库的时候 一定记得转型 float 否则会缺失精度;

2、char 指针容易犯的误区(原C语言声明字符串的方法);
int main()
{
char ch = ‘a’;
char pr_ch = &ch;
cout << "pr_ch " << pr_ch << "\t
pr_ch\b的值" << *pr_ch << “\tpr_ch\b真实的值:”<< (void ) pr_ch << endl;
// >>> pr_ch 乱码 因为 机器认为 char * 是声明的字符串 这里输出的 相当于 把 ch 的地址看作成字符串来理解转换 输出所以乱码
// 但是取地址后 &pr_ch (
(&pr_ch)) 仍可以输出 ch -(‘a’)
char *str = “mine is string”;
cout << "str " << str << endl;
// >>> 输出字符串 mine is string
}

数组名可以理解为数组开辟的一块连续空间的首地址 但也不完全是首地址
int temp_ array[5];
Int *ptr_ temp_array = temp_array; // 定义一个整型指针变量;用来存放数组 temp_array 的首地址;

sizeof(temp_array); // >>> 20(4*5)
sizeof(ptr_temp_array) // >>> 4 含义即是地值所占的字节 一般来说操作系统的第值是以十六进制来表示的地址 如00ffaa; 所以占四个字节;

使用指针一定避免指针悬挂 // 野指针
Int *ptr_int_value = new int; // new 关键字申请内存后 返回的是内存地址;
ptr_int_value++; // 盲目加加 使得指针指向地址偏移 原来的地址存放的数便没有指针指向 这样便会造成内存益处;

/因为 new关键字使用的时候是在程序占用内存 的堆区 申请开辟的一块内存 所以造成 指针悬挂后 原内存 地址占用的空间可能不会被操作系统回收 (危险:)/
delete ptr_int_value; // 在使用 new 关键字后 如果该内存地址的值不在会被使用 请及时清理;
使用new 关键字 定义数组 指针时因该如下定义:
Int *array = new int[5] ;//定义了一个容量为5 的整型数组 并将数组的首地址赋给array 指针变量;
delete[] array; // 释放内存时 应采用这种特殊的方法 不过最新版的已经可以直接使用 delete 关键字进行直接释放;

定义指针变量时一定注意 赋初值:
// 没有初值也一定 使用 nullptr 字面量进行赋初值;
Int *ptr = nullptr;
Int *ptr2 = 0; // 与上面个的方法是完全一样的 nullptr 的字面量就是 0;
/在定义指针变量的时候如果没有给指针变量赋初值那么 系统默认还是会给一指针一个初始地址;这样如果直接修改指针变量所指地址的值 那么就不知到修改的系统的什么值 就非常危险 慎重!;/

3、程序的内存分配:
?栈区(stack)
→ 由编译器自动分配释放,一般存放函数的参数值、局部变量值等;
→ 操作方式类似数据结构种的栈 - 先进后出;
?堆区(heap)
→ 一般由程序员分配释放,若程序员不释放,程序结束时可能会由操作系统进行回收;
→ 注意: 与数据结构中的堆是两回事 分配的方式类似于链;
?全局区(静态区-static)
→ 全局变量和静态变量是存储在一起的;
→ 程序结束后由系统自行释放;
?文字常量区
→ 常量字符串就放在这里,程序结束由系统自行释放;
?程序代码区
→ 存放程序代码的 二进制格式;
在这里插入图片描述

发布了27 篇原创文章 · 获赞 62 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42359956/article/details/87297627