指针的基本概念

文章详细介绍了内存的编号机制,32位和64位系统的差异,以及指针的基本概念,包括指针变量的定义和解引用操作。讨论了指针的大小、指针类型的重要性和指针运算规则。特别强调了野指针的问题,如未初始化、越界访问和释放后仍使用的情况,并给出了避免野指针的策略。此外,还涵盖了指针和数组、二级指针以及指针数组的内容。
摘要由CSDN通过智能技术生成

目录

一.内存

二.指针

三.指针的大小​编辑

四.指针和指针类型

指针的定义方式

指针类型的意义:

 

五.野指针

指针未初始化 

越界访问

指针指向的空间释放

如何避免野指针

指针初始化 

小心指针越界

指针指向的空间释放及时指NULL

指针使用之前检查有效性

指针运算

指针+-整数    

指针-指针

指针之间的关系运算

 ​编辑

指针和数组

 二级指针

指针数组


指针就是地址,口语中的指针指得是指针变量

一.内存


1.内存如何进行编号?
电脑常见有32位和64位

电脑32位和64位地址线是物理线,可以通电,会产生1和0的电信号,电信号转换为数字信号(由1和0组成的二进制序列),由不同的排列进行编号

2.一个内存单元是多大空间?
列如,32位

2的32次方内存单元

2^32=4294967296 bit

/8=536870912 byte

/1024=524288 kb

/1024=512 mb

/1024=0.5 gb

无论多少位的计算机,一个内存单元都是一个字节


二.指针


 a在内存中要分配空间的4个字节

pa是用来存放地址的,pa叫做指针变量

*说明pa是指针变量,int说明pa执行的对象是int类型的

(char ch='a';

char*pa=&ch;)

%p专门用来打印地址

 *解引用操作,*pa就是通过pa里的地址找到a,可以通过*pa改变a中的值

三.指针的大小


指针的大小是相同的,在32位平台是4个字节,在64位平台是8个字节

指针需要多大空间取决于地址的储存需要多大空间 

四.指针和指针类型

指针的定义方式

type+*+指针名

char *p=NULL

int *p=NUll

short *p=NULL

long *p=NULL

float *p=NULL

double *p=NULL


指针类型的意义:

1.指针类型决定了:指针解引用的权限有多大(能操作几个字节)

列如char*的指针解引用只能访问一个字节,而int*的指针解引用可以访问四个字节

p解引用访问的大小是sizeof(type)个字节

2.指针类型决定了:指针走一步,能走多远

整型指针+1跳过四个字节

字符型指针=1跳过一个字节

type *p

+/- n

跳过n*sizeof(type)个字节

 

五.野指针


野指针就是指针指向的位置是不可知的(随机的,不确定的,没有明确限制的)

指针未初始化 

p是一个局部的指针变量,局部变量不初始化的话默认是随机值

*p=10;非法访问

这里的p就是一个野指针

越界访问

当进行for循环,指针指向的范围超过数组arr的范围时,p就是一个野指针

指针指向的空间释放

这里的变量a进入函数创建,退出函数销毁,指针变量p指向a的空间就是野指针 

如何避免野指针

指针初始化 

当不知道p应该初始化为什么值时,直接初始化为NULL    int*p=NULL;

明确知道什么值时   int a=10;int *p=&a;

小心指针越界

指针指向的空间释放及时指NULL

指针使用之前检查有效性

 判断有效性的前提是对指针进行初始化

指针运算


指针+-整数    

指针加减整数的意义在于指针在数组中位置的移动

指针+1并不是在指针地址的基础上+一个地址,而是+一个元素所占的字节数

列如

int*指针,1代表4个字节地址

char*指针,1代表1个字节地址

通用公式

p +/- n 代表p的基地址+/-n*sizeof(type)个字节地址

如初始化数组

指针-指针

前提 两个指针指向同一个空间

 指针-指针得到的是两个指针之间的元素个数

实现strlen函数

指针之间的关系运算

 

标准并不保证可行

标准规定 :允许指向数组元素的指针与指向数组元素后面的那个内存位置的指针作比较,但是不允许与指向数组第一个元素前的位置指针作比较

指针和数组


数组名是数组首元素的地址

 有两个例外

1.sizeof(数组名),数组名指的是整个数组

2.&数组名,数组名指的是整个数组

既然数组名是地址,那么我们就可以用指针来访问数组

 二级指针

int a=10;

int *pa=&a;   pa是指针变量,一级指针

int **ppa=&pa;  ppa也是一个变量,二级指针变量

   

pa中存放着a的地址,pa是一个一级指针变量,ppa中存放着pa指针变量的地址,ppa就是一个二级指针变量

 

 

存放指针地址的变量称为二级指针,以此类推我们可知三级指针,,,

指针数组

存放着指针的数组,本质还是数组

int*par[5]

 

char*pcr[5]

 

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值