【C++必知必会】指针常见用法和解引用

1. 指针要点以及容易踩坑的地方

  1. 指针也是变量,那么变量的话就是有值和有地址,指针的值就是所指向变量的地址,解引用就是把地址扒开拿到地址对应的那个值。
  2. 指针的步长是动态的,取决于指向变量的类型。比如int *p,指向的类型就是int 变量,那么步长就是int类型的字节即4字节,比如int **p或者int ***p,指向的类型就是指针类型变量,那么步长就是指针类型的字节即4字节(32位)或者8字节(64位)。需要注意的是,无论是几级指针变量,都是指针类型,所以一级指针也能指向三级指针。继续往深了说,当两个指针分别指向不同类型的变量时,比如一个指向char类型的变量,另一个指向int类型的变量,如果把指向int类型的指针变量赋值给指向char类型的指针变量,此时应该就会有指针类型的隐式转换发生,那么步长也会随之调整。
  3. 在C++中,将一个指向 int 类型的指针强制转换为指向 char 类型的指针不会改变存放在指针中的地址。指针本身所包含的地址值保持不变,改变的是指针的步长,即它的解引用行为会改变。指向地址0的指针就是空指针,地址0不能访问,也就是说不能解引用。
  4. 指针本身所占地址/内存的大小由编译器决定,具体来说,编译成32位机器的代码时(由x86平台编译),指针占4个字节;编译成64位机器的代码时(由x64平台编译),指针占8个字节。需要补充说明的是:32位机的内存地址用8位16进制数表示原因如下 :32位表示CPU一次可以处理32位数据or一次可以寻址32位,就是4个字节的数据。一位十六进制数可以转化为四位二进制数,所以32位二进制数换算为十六进制数后的位数就变为32÷4=8位。
  5. 对于int a[10] = {0, 1, 77, 88}而言,a的值是数组首元素的地址,而&a是整个数组的地址,所以&a并不能理解为二级指针,而是一个一级指针!!所以a+1,就是第二个元素的地址,int类型占用4个字节,所以前后相差4。&a+1,就是向后移动(10*4)个单位,所以前后相差40。
  6. 编译器编译时,char*会隐式转换成string类型,他们都表示字符串类型。而char类型只能用来存储字符!string字符串类型都是申请一块连续内存用于存放字符串,所以我们通过递增指针指向的地址就能取到所有的字符!比较容易踩坑的一个地方:C++中单引号是表示字符(一个字符占一个字节),双引号才表示字符串
  7. 数组方括号[ ]取值的原理:比如我们有char* a[10] = {“ww”, “dd”,“qq”}这样一个数组(char *argv[]和char **arg是等效的), a在这里为数组的首地址,那么a[1] = *(a+1),而且由于数组的元素在内存中连续存储的原因,我们就可以依次递增指针指向的地址来访问数组的其他所有元素。取出来的这个元素类型就是char*,如果要赋值给string类型的变量时,char*类型就会被编译器隐式转换为string类型
  8. 形参和实参在内存中是两块地址!形参在调用的时候才会分配内存,调用结束立即释放;而实参则是最初就会分配内存。

补充:
在C++/C中,变量名只是标识符,对变量名的理解是在变量定义时候,把某一区域的存储空间起一个别名(变量名)。在程序编译时,变量名被转换为对应的内存地址,该地址用于存储变量的值
在这里插入图片描述

2. 例子

例子一、
指针: int num = 4; int *p = &num,表示将整型num变量的地址赋值给一级指针变量p,一级指针变量p存放的内容就是整型num变量的地址
解引用: *p,表示对指针变量p进行解引用就是把p内容的这个地址对应的东西解开,解出来,就像打开一个包裹一样,拿到它的值,那就是该变量的值了。

例子二、
指针: int **pp=&p,表示二级指针变量pp内容存放的是一级指针变量p的地址。我们可以将int **q 分为两部分来看,即为 int* 和 (*q),对于后面 (*q) 中的“*”表示 q 是一个指针变量,而前面的 int 表示指针变量 q 只能存放 int* 型变量的地址。所有对于二级指针甚至多级指针,我们都可以把它拆成两部分。首先不管是多少级的指针变量,它都是一个指针变量,指针变量就是一个“*”,其余的“*”表示的是这个指针变量只能存放什么类型变量的地址。所以照猫画虎,int *p的意思就是:p是指向int类型的指针变量。

需要注意的是,数组能用方括号[ ]取值的原理比如我们有char a[ ]这样一个数组, a在这里为数组的首地址,那么a[1] = *(a+1),而且由于数组的元素在内存中连续存储的原因,我们就可以依次递增指针指向的地址来访问数组的其他所有元素。

3. 解引用

解引用一般是发生在使用指针的阶段,并非定义指针的阶段!
*pp = &a,对二级指针变量pp进行解引用就是把变量pp内容的这个地址对应东西给解开,拿到它的值,那就是a的地址了。

Refer:
【C语言】如何理解多级指针?
C/C++数组首元素的地址和数组地址的区别
C语言指针强制类型转换
C/C++形参和实参的区别?

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值