C&C++ 指针 #10
JAX1024Dev
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
前言
指针是一种变量,其存储的是值的地址,而不是值本身。
地址运算符&:当对变量使用时,可以得到变量的地址。
解除引用运算符*:将其用于指针可以得倒该地址处存储的值。
一、基础
1.1 声明和初始化指针
计算机需要跟踪指针指向值的类型。不同的数据类型的地址看上去没什么两样,但是它们占用的字节数确实不同的。因此,在指针声明时必须指定指针指向数据的类型。
二、指针与数组
2.1 使用 new 来创建动态数组
在编译时就确定数组的长度,被称为静态联编 static bind。在程序运行时确定数组的长度,称为动态联编 dynamic bind。
静态联编不意味着静态存储持续性,后者意味着编译器将分配固定的内存来存储。前者只是指编译器确定了数组的长度。对于静态联编的数组,要么在静态存储区被创建,要么在栈上被创建,其地址与容量在其生存周期内保持不变,只有内容可以改变。
2.2 指针、数组与指针算术
指针和数组基本等价的原因在于指针算术和C++内部处理数组的方式——使用指针来处理数组。
在多数情况下,C++ 将组数名解释为数组第一个元素的地址。
对指针进行+1操作时,其增加值为其指向的类型占用的字节数,这也解释了前文计算机需要跟踪指针指向的类型。
在大多数情况下,可以用相同的方式处理指针和数组。
指针与数组的两大区别
2.3 数组的地址
对数组取地址时,数组名不会解释为其地址
数组名被解释为它第一个元素的地址,而对数组名应用地址运算符时得到的是整个数组的地址。
这两个看似一样,实则不然。当进行如下表达式时将会发现不同。
可以这么说,a 是
int *指针。而 &a 是这样一种指针int (*)[10],指向包含10个int类型的数组。指向数组的指针和数组指针
优先级:
[] > *。三、指针与内存管理
3.1 指针传递内存
使用函数参数传递
如果函数的参数是一个指针,不要指望用该指针去申请动态内存。
上述代码执行后,str 指向的地址保持不变,使用 malloc 申请后的内存地址只是存储在了p在函数中的副本中。如此一来不仅没有实现,反而造成了内存泄漏。
如果非要用指针去申请内存,应该用指向指针的指针。
使用函数返回值传递
主要不要用return语句返回指向“栈内存”的指针。
Beta Was this translation helpful? Give feedback.
All reactions