对指针的理解

指针个人理解为指向某个特定数据存储地址的变量。

一、指针的类型

指针的类型与指针所指向数据的类型无关,可以根据需求灵活选取指针的类型

常用的指针类型有:char*、short*、int*、float*、double*等

不同的指针类型决定向前走一步与向后走一步的步长,例如:char*走一步指针指向移动一个字节,而int*走一步指针指向移动四个字节

特殊的指针:

1.数组指针

数组名指向的就是数组首元素的地址,但是有两个例外,一是使用sizeof函数、二是&操作符直接作用于数组名,当出现这两种情况时,数组名指向的就是整个数组的数据,此时,数组名这个指针走一步,那么指针指向移动该数组大小的字节数。

二维数组的每一行是一个一维数组,因此二维数组的首元素是一个一维数组。

因此在数组传参时,接受数组的就是一个指针。

2.函数指针

void (*pf)(int,int)

void就是函数的返回类型,两个int是函数接受的数据类型,pf即为该函数指针的名字,注意*与pf需要用()结合在一起。

void(* signal(int,void(*)(int)) )(int)

signal是一个函数声明,该函数接收两个数据,一个类型是int,一个类型是接受数据类型是int,返回void的函数指针。signal函数返回的数据类型是接受数据类型是int,返回void的函数指针。只要能很好的理解上面这个函数声明,就能很好的理解函数指针。

拓展:函数指针数组

函数指针数组是一个数组,而数组里存放的是函数指针

void (*pf[4])(int,int)

以上即为一个函数指针数组,通过该数组可以做到回调函数,从而降低代码的复杂程度。

二、指针的使用

在写代码时,难免需要进行传参的操作,我们通过指针接受参数,就可以在函数中对存储的数据进行操作。

1.const的修饰

const char* p,此时const修饰的就是指针p所指向的数据,当我们传了指针p的参数后,又不希望函数修改p指向的数据内容时,就可以通过const修饰限制

char* const p,此时const修饰的就是指针p,也就是p所指向的地址会被const限制,p就只能指向当前数据的地址,而数据的内容可以进行修改

2.数组指针的调用

arr[0],我们已经知道数组名通常指向数组的首元素,因此系统调用arr[0]时,实际会解读成*(arr+0)

arr[0][1],二维数组的解读则为:*(*(arr+0)+1),二维数组的首元素是一个一维数组,因此*(arr+0)       指向的就是第一行的数组,*(*(arr+0)+1)指向的就是第一行第二列的元素

3.二级指针

指针同样是一个数据,需要储存起来,那么指向这个指针的指针就称为二级指针

例如:int* *p,*p表示是一个指针,int*表示该指针指向的数据类型是指向整型的指针

指针可以说是C语言使用的一个很重要的元素,以上知识点可能不全,因此还需要多敲代码来巩固实践,也在实践中更多的了解指针的知识。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值