C++的指针

指    针

指针(pointer)是一个变量,该变量存储的是另一个变量的地址,其声明语句为

type  *ptr_name;

type是指针的基类型,必须是一个有效的C++数据类型,ptr_name是指针变量的名称,* 星号用来声明指针,如下是有效的指针声明

int     *ip;           
double  *dp;
float   *fp;
char    *cp;

不管什么类型的指针,其实际的数据类型都是相同的,即一个代表内存地址的十六进制数,不同数据类型表示的是指向的变量或常量的数据类型不同

1. 获取对象的地址

使用取地址运算符&,用法如下

int num;
int *ptr1 = #
int *ptr2 = ptr1;

2. 指针值的状态

  • 指向一个对象
  • 指向紧邻对象所占空间的下一个位置
  • 空指针,意味着指针没有任何指向对象,指针变量的值为Null,  int *ptr = Null    ptr的值为0
  • 无效指针,曾指向一个有效地址,但由于指针指向的内存单元被释放了,故不能用该指针访问原地址,不会产生一些问题
  • 野指针,没有被正确的初始化,指向的是一个随机的内存地址,野指针是严重错误

利用指针访问对象时,使用解引用运算符

3. 指针的算术运算

指针是一个用于表示地址的数值,故可以对指针执行四种算术运算,包括 ++ 、--、+、-

指针的加减会对应在地址上加减数据类型所占的字节空间

假设ptr是一个指向地址1000的整形指针,是一个32位的整数,当对指针执行ptr++操作时,ptr指向的地址将变为1004,因为ptr增加一次,指向了下一个整数,每个整数占4个字节

指针还可==、!=、>、<进行比较

4. 指针和数组

指针和数组在大部分情况下可以互换,如下

复制代码
#include<iostream>

int nums[4] = {0,1,2,3};
int *ptr;
ptr = nums;

// 二者输出的都是0
cout << nums[0] << endl;
cout << *ptr << endl;
复制代码

但是nums是一个指向数组首元素的常量指针,不能修改,ptr可以修改

5. 数组指针和指针数组

数组指针是指向数组首元素的一个指针,指针数组是一个存放指针的数组

指针数组通常被用来表示多个字符串,相比于二维字符数组,指针数组的优点为

  • 指针数组中每个元素所指的字符串不必限制在相同的字符长度
  • 访问指针数组中的一个元素使用指针间接及逆行的,效率比下标方式要高
  • 但是指针数组不能像二维字符数组一样通过下标修改某一元素的值
char str_list1[][128] = {"someone","like","you"};
const char *str_list2[3] = {"someone","like","you"};

cout << str_list1[0];     // someone
cout << str_list2[0];     // someone 

6. 指向指针的指针

指向指针的指针是一种多级间接寻址的形式,或者说是指针链,间接寻址可以扩大变量的表示范围,缺点是多级访问增加时间

 

一个指向指针的指针变量必须使用俩个星号进行声明

int **ptr;

同样的,想要访问这个指针最终指向的值需要两个**

7. 传递指针给函数

C++允许传递指针给函数,只需要简单的声明函数参数为指针类型即可,例子如下  (不就是指针作为参数么),同时自然也可以使用数组作为参数

复制代码
#include<iostream>
using namespace std;

// 写函数的时候应该习惯性的先声明函数,然后再定义函数
void getSeconds(unsigned long *par); int main(){ unsigned long sec; getSeconds( &sec ); cout << sec << endl; return 0; } void getSeconds(unsigned long *par){ *par = time(Null); return; }
复制代码

Tip: 之前一直不懂为什么return 0,还有opencv好多函数没有返回值,而是需要定义变量,是因为定义函数时,首先要声明函数的返回值类型,当返回值有多个不同类型的时候,就没有办法直接返回了

8. 从函数返回指针

C++允许从函数返回指针,需要声明一个返回指针的函数,如下所示

int * getptr(){
     .
     .
     .  
     return ptr;  
}

 

posted @   Liang-ml  阅读(118)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示