浅谈数组与指针

数组与指针

在这里首先强调一下:数组就是数组,指针就是指针,指针和数组是完全不同的两码事。
对二者进行简单对比:

指针

(1) 保存数据的地址,任何存入指针变量p的数据都会被当作地址来处理,p本身的地址由编译器另行存储,存储在哪里我们并不知道。
(2)间接访问数据,首先取得指针变量p的内容,把它作为地址,然后从这个地址提取数据或向这个地址写入数据。指针可以以指针的形式访问*(p+i),也可以以下标的形式访问p[i]。但本质都是先取p的内容然后加上 i*sizeof(类型)个byte作为数据的真正地址。
(3)通常用于动态数据结构。
(4)相关函数为malloc和free。
(5)通常指向匿名数据。

数组

(1)保存数据,数组名a代表的是数组首元素的地址而不是数组的地址,&a才是整个数组的地址,a本身的地址由编译器另外存储,存在哪里我们不知道。
(2)直接访问数据,数组名a是整个数组的名字,数组内每个元素并没有名字。只能通过“具名+匿名”的方式来访问某个元素,不能把数组当一个整体进行读写操作,数组可以以指针的形式访问 (a+i);也可以以下标的形式访问 a[i]。但其本质都是 a所代表的数组首元素的首地址加上 isizeof(类型)个byte作为数据的真正地址。
(3)通常用于存储固定数目且数据类型相同的元素。
(4)隐式分配和删除。
(5)自身即为数组名。

指针数组和数组指针

接下来讨论一下指针数组和数组指针的差异:
指针数组:指针数组是数组,是一个存放指针的数组。
数组指针:数组指针是指针,指向一个数组。
如下:

int p[10];------指针数组([]的优先级高于,所以p先和[]结合,表明这是一个数组,数组里存放int *类型的指针变量)
int(p)[10];-----数组指针(p先和结合,说明p是一个指针变量,该指针指向一个大小为10的整型数组)

数组地址的存储:

int arr[10] = { 0 };
int(*p)[10] = &arr;(p是一个数组指针,该指针指向数组arr,p里面存放arr的地址)

一级指针传参与二级指针传参:
当一个函数参数部分为一级指针时,函数能接收的参数类型:
(1)整形的一维数组(一维数组传参时实际上传的是首元素的地址);
(2)整形变量的地址;
(3)整形指针。
函数参数为二级指针是函数能接收的参数:
(1)一级指针变量的地址;
(2)二级指针变量。
下面来看一个代码的解析:

int(*parr[10])[5];(parr[10]是一个数组,该数组有十个元素,每个元素为一个数组指针,数组指针指向一个数组,所指向的数组每个数组有五个元素)

函数指针

接下来了解一下函数指针:
函数指针:它是一个指针,指向一个函数。
定义如下

void(pfun)( ) // void为它的返回类型,这里不局限于void,也可以是int型或char型,后面的()里是函数的参数

下面来解析两个比较复杂的代码:
第一个代码:

((void()())0)() :(只是一个关于解决计算机开机启动后,硬件读取首地址为0位置的代码)第一步:void()()这是一个函数指针类型,该函数没有参数,没有返回值;第二步:(void()())0:把0强转成void类型的函数指针,因此这一部分整体相当于一个指针,为方便起见,在此用p表示(void()())0。那么((void(*)())0)()就可简写为–(*p)():该指针指向一个函数,函数在此被调用。

第二个代码

void(signal(int, void()(int)))(int);------先从signal入手,它是一个函数名,void()(int)是一个函数指针。signal函数的参数有两个,一个为int,一个为函数指针,该指针指向函数的参数为int,返回类型为void。signal(int, void()(int))又作为一个整体,于外面的部分构成一个函数指针,该指针指向参数为int,返回类型为void

函数指针数组

定义:把函数的地址存到一个数组中,该数组就叫做函数指针数组

定义表示如下:
int(parr[10])();--------parr先和[]结合,说明parr是数组,数组的内容是int()()类型的函数指针。
函数指针数组的用途:在转移表中使用。

指向函数指针数组的指针

概念:指向函数指针数组的指针是一个指针,该指针指向一个数组,数组的元素都是函数指针。
举例说明:

char*((pf)[3])(charp);---------pf是一个指针,该指针指向一个数组,数组里存放了三个指向函数的指针,指针所指向的函数参数为char型的字符指针,返回类型为char*型的字符指针。

以上内容为学习小结,如有理解错误之处望大家多多指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值