首页 > 其他分享 >深入指针

深入指针

时间:2023-11-25 19:31:40浏览次数:49  
标签:变量 int 地址 深入 数组 函数指针 指针

一、指针概括

1、指针定义

 Def:  指针(pointer)也就是内存地址(指针==地址),指针变量是用来存放内存地址的变量,在同一CPU下,不同类型的指针变量所占用的存储单元长度是相同的,但所占空间大小由指针变量的类型所决定。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。


     一般形式为:类型(int char long short...) * 变量名


      void*为泛指类型,可以用来接收任何类型的地址,但不能直接解引用或位置加减


2、指针运算符

&   取址运算符

  功能:取出变量的内存地址(升一级)  

*    取值运算符(解引用)

  功能:访问指针指向的变量内容(降一级)


3、指针大小

 (a)×86(32位):32个bite位(相当于32个地址总线),占4个字节空间大小,最多占2^32字节空间大小(一个地址线发出两个信号)


(b) ×64(64位):64个bite位(相当于64个地址总线),占8个字节空间大小,最多占2^64字节空间大小(一个地址线发出两个信号)


注:大小与变量类型无关,变量类型只决定指针解引用访问的权限大小和向前向后走的长度


4、const修饰指针(变量不变)

 const放在的左边限制p(为p指向空间的内容,p不受限制)【const int * a / int const * a】

深入指针_数组

const放在*的右边限制p(为p的地址,*p不受限制)【 int * const a】

深入指针_数组_02

5、指针运算

a、指针+/-数字=指针;


b、指针-指针=指针之间元素的个数(数字)【两个指针需要指向同一区域】


c、指针见的关系运算【比大小(地址的高低)】


6、野指针

(1)指针的初始化

通过赋值语句初始化指针变量:int * pa = &a(将a的地址赋值给pa指针变量,*告诉我们pa为指针,int告诉我们pa指向的空间存的数据为int类型,int *告诉我们pa的类型)


(2)野指针的形成

a、定义

 Def:C语言中指针初始化是指给所定义的指针变量赋初值。指针变量在被创建后,如果不被赋值,他的缺省值是随机的,它的指向是不明确的,这样的指针形象地称为“野指针”。野指针是很危险的,容易造成程序出错,且程序本身无法判断指针指向是否合法。


b、成因

#变量未初始化(局部变量为随机值,全局变量默认为0)


#指针访问越界


c、规避

#可以在指针定义后,赋值NULL空值

也可写成:p=0或p='\0'


这两种形式和p=NULL是等价的


深入指针_函数指针_03


举例说明


 上面两行代码的含义是,指针变量p被赋值为空。虽然定义了一个指针变量,但是它并不指向任何存储空间。


#使用assert断言

包含头文件#include<assert.h>,用于终止错误代码并指出路径


assert的使用

(1)表达式:assert(表达式)【仅在Debug版本使用,release版本不行(Linux系统可以)】


(2)可用#define NeDEBUG取消断言


7、简易应用

1、交换两个int类型的值:


a、引入第三变量交换(常用)


b、使用按位异或^进行交换(罕见)


c、传址调用(让函数与主调函数产生联系)


二、二级指针

1、定义:用于存放指针变量的指针变量称为二级指针

深入指针_数组_04

注:第二个*告诉我们pb为指针,int*告诉我们pb所指向的空间存储数据类型为int型指针,int**告诉我们pb的类型为二级指针。


三、指针数组

1、定义:(本质为数组)数组元素为指针变量的数组成为指针数组


2、形式:


int *arr[ ]形式等同于int arr[ ]


四、字符指针

1、定义:用于存放字符(数组)地址的变量成为字符指针(变量)。

深入指针_函数指针_05

p[3]=>"abcdef"[3]=d(%c)

五、数组指针

1、定义:用于存放数组地址的变量成为数组指针(变量)。

深入指针_数组_06

六、数组传参

1、数组名相当于数组首元素的地址(一维)

       二维数组数组名相当于第一行即第一个一维数组的的地址

2、数组传参的本质是传数组首元素的地址

深入指针_数组_07

arr[i][j]==*(*(arr+i)+j)   *(arr+i)==arr[i]


七、函数指针(数组)

1、定义:函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。函数指针有两个用途:调用函数和做函数的参数。


               函数指针数组是一个其元素是函数指针的数组。那么也就是说,此数据结构是一个数组,且其元素是一个指向函数入口地址的指针。


2、函数名==&函数名==函数的地址


3、形式:int(*p)(类型)p为函数指针,指向类型为int(*)(类型)


                int(p[])(类型)数组存放数据类型为int()(类型)p[]为数组

3、应用:


(1)简易

深入指针_数组_08

深入指针_函数指针_09

2)与函数指针数组合作用于实现计算器(回调函数)


专业术语为转移表( 使用转移表可以替代冗长的switch和if-else语句,分离了具体操作和选择代码,是一种良好的设计方案。和其他指针一样,对函数指针执行间接访问之前,必须把它初始化并指向某一个函数。)



标签:变量,int,地址,深入,数组,函数指针,指针
From: https://blog.51cto.com/u_16298007/8562040

相关文章

  • 深入解析:如何开发抖音票务小程序
    当下,开发抖音票务小程序成为了吸引年轻用户群体的一种创新方式。本文将深入解析如何开发抖音票务小程序,探讨关键步骤和技术要点。1.确定需求和功能考虑到抖音的用户特点,可以加入与短视频相关的票务功能,如在线购票、观影记录分享等。2.注册和配置开发者账号注册完成后,获取开发者ID和......
  • 深入理解RC4加密算法
    RC4(RivestCipher4)是一种广泛应用的加密算法,由RonaldL.Rivest于1987年发明。它是一种流密码(streamcipher)算法,适用于对网络通信中的数据进行加密保护。RC4加密解密--一个覆盖广泛主题工具的高效在线平台(amd794.com)https://amd794.com/rc4encordec1.RC4的工作原理RC4的核心......
  • FreeRTOS深入教程(信号量源码分析)
    (文章目录)前言本篇文章将为大家讲解信号量,源码分析。在FreeRTOS中,信号量的实现基于队列。这种设计的思想是利用队列的特性来实现信号量,因为信号量可以被视为只能存储0或1个元素的特殊队列。在FreeRTOS中,二进制信号量(BinarySemaphore)通常由一个队列和一个计数器组成......
  • 深入理解RC4加密算法
    RC4(RivestCipher4)是一种广泛应用的加密算法,由RonaldL.Rivest于1987年发明。它是一种流密码(streamcipher)算法,适用于对网络通信中的数据进行加密保护。RC4加密解密--一个覆盖广泛主题工具的高效在线平台(amd794.com)https://amd794.com/rc4encordec1.RC4的工作原理RC4的......
  • c语言中的指针用法
    1、指向函数的指针在C语言中,函数名实际上是一个指向函数的指针,所以你可以直接使用函数名add来初始化函数指针,而不需要使用&add。在这种情况下,add和&add是等价的。这是因为在C语言中,函数名是函数的入口地址的别名。当你使用函数名时,你实际上获取的是函数的入口地址。这就是为什么......
  • 关于map容器的迭代器深入学习
    #include<iostream>#include<map>usingnamespacestd;intmain(){std::map<int,std::string>myMap={{1,"one"},{2,"two"},{3,"three"}};autoitBegin=myMap.begin();//迭代器指向开头位置std::cout&l......
  • 10_填充每个节点的下一个右侧节点指针
    填充每个节点的下一个右侧节点指针给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:structNode{intval;Node*left;Node*right;Node*next;}填充它的每个next指针,让这个指针指向其下一个右侧节点。如果找不到下一个......
  • surface pro4 鼠标指针闪烁、触摸屏不灵
    同事的平板长时间不用。出现:鼠标指标闪烁,触摸屏不灵的情况。尝试:一、更新系统问题依然出现二、调整各种设置总是依然出现三、百度到一篇可能是设备冲突禁用人机接口中的第一个“符合HID标准的触摸屏”总是解决。各文中提到的现象不完全一致,但类似。猜想可能是设备冲突引......
  • 【转载】Qt中的智能指针
    不用到处找了,附高质量博客链接Qt智能指针介绍:QSharedPointer、QWeakPointer、QScopedPointer、QPointer(附实例)-CSDN博客Qt智能指针信号槽连接问题_qtconnect智能指针_Jason~shen的博客-CSDN博客......
  • C++ 指针进阶:动态分配内存
    C++动态实例化(new和malloc)目录C++动态实例化(new和malloc)malloc/free工作原理具体使用动态创建一维数组动态创建二维数组callocreallocnew/delete工作原理具体应用动态实例化动态创建数组动态创建二维数组malloc和new的主要区别malloc/free工作原理malloc是......