【C语言】指针

前言

什么是指针:

  • 在计算机科学中,指针( Pointer )是编程语言中的一个对象,利用地址,它的值直接指向( points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址您的内存单元
  • 指针就是个地址,地址是什么就是内存单元的编号,在这里是一个编号八个字节而不是一对一(比如在VS逐过程中调试查看的的获取值)
  • 指针是一种特殊的变量,它存储的是内存地址。通过指针,可以直接访问和操作内存中的数据。这是第二重含义
  • 指针在C语言中具有的用途,可以用于动态内存分配、传递参数、实现数据结构等。
  • 但需要注意的是,使用指针需要谨慎,因为指针操作涉及到直接访问内存,容易引发内存错误和安全问题。

一般情况下指针也可以称之为:编号、地址,就如我们住址一样只要在内存存在计算机就会给数据分配地址或者叫做编号;

地址的基本单位是字节,就比如说我们一个整数是四个字节,那么我们用指针指向整数那么就同时指向四个字节

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

一 、指针和指针类型

1、指针类型决定了,指针引用的权限有多大:

比如整型指针能访问四个字节、字符指针能访问一个字节、浮点指针能访问八个字节……

2、指针类型决定了,指针走一步,能走多少个指节也就是步长:

比如整型指针加一能走四个字节、字符指针加一能走一个字节、浮点指针加一能走访问八个字节……

3、使用的类型不同可以达到的效果也不同,也就是说极大的使我们使用指针时自由化、细节化,在不同功能需要时使用在需要的类型,编写代码指向谁区别不大,主要还是看类型

二、野指针

概念:野指针就是指针指向的位置是不可知的( 随机的、不正确的、没有明确限制的 )

1、野指针成因
  • 指针未定义

  • 指针越界访问,去访问不是需要的范围

  • 指针指向的空间释放
2、如何避免野指针
  • 指针初始化,定义为0或NULL
  • 小心指针越界;C语言本身是不会检查数据的越界行为的
  • 指针指向空间释放即使置NULL(也就是空指针)
  • 指针使用之前检查有效性

NULL是不允许我们进行访问的,不属于我们操作系统

三、指针运算

1、指针+-整数

2、指针-指针

指针与指针相减的前提是在同一块空间

3、指针的关系运算

标准规定注:

允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较;因为地址之前的地址可能已被占用,而后面的地址一般情况下是不会先被占用。

四、指针和数组

我们已知数组名是数组的首元素地址在写代码时可以与首元素一样的效果,如

注:当指针加 1 时是跳过一个地址到第二个地址    如: //arr[2]  == *(p+2)

从某种程度上来说指针和数组在指向地址时是较相似,因为数组名是首元素地址,而指针一般情况下也是指向首元素地址,加之交换率的存在,所以在指向地址方面有很多相似的地方

如图:

五、二级地址

指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里 ?这就是二级指针

我们已知一级指针变量是用 * 来表示,二级指针就在 * 基础上加上 * 所以二级指针用 ** 来表示;需要注意的是当你使用指针的时候就已经重新创建了一个新地址,

int main()
{
	int a = 0;
	int * pa = &a;//pa是指针变量,一级指针
	int** ppa = &pa;//pa也是变量,
	//&pa取出pa在内存中的起始地址,
	// 所以是二级变量?这就是二级变量的定义?
	return 0;
}

二级指针就是指向指针的指针,二级指针中存储的是指针的地址。指向存储指针空间的首地址。二级指针的定义相对于一级指针更加复杂,因为它涉及到指针和数组的混合。在定义不同类型的二级指针时,在使用的时候有着很大的区别。这种层层递进的指向以次叠加三级、四级等……也可以实现就是使用的较少而已。

作用:

二级指针可以传递一级指针的地址进函数,从而在函数内改变函数外一级指针的值。这在需要动态分配内存或者需要改变指针指向的情况下非常有用,例如在顺序表中插入和删除操作中。通过二级指针,我们可以改变指针指向的位置,从而实现对数组或者链表的操作。

六、指针数组

指针数组的定义就是任意类型指针的数组

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值