微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 周立功教你学C语言编程:教你数组是如何保存指针的

周立功教你学C语言编程:教你数组是如何保存指针的

时间:07-31 来源:ZLG致远电子 点击:

第一章为程序设计基础,本文为1.8.3 指针数组。

 

>>>> 1. 字符串与指针数组

 

如果有以下定义:int data0 = 1, data1 = 2, data2 = 3; 

int *ptr0 = &data0, *ptr1 = &data1, *ptr2 = &data2;

 

实际上地址也是数据,那么数组也可以保存指针,因此可以在基本数据类型的基础上派生一个构造类型,即将相同类型的指针变量集合在一起有序地排列构成指针数组。在指针数组变量的每一个元素中存放一个地址,并用下标区分它们。虽然数组与指针数组存储的都是数据,但还是有细微的差别。数组存储的是相同类型的字符或数值,而指针数组存储的是相同类型的指针。比如:

int  data0, data1, data2; 

int *ptr[3] = {&data0, &data1, &data2}; 

 

该声明被解释为ptr是指向int的指针的数组(元素个数3),"int *[3]"类型名被解释为指向int的指针的数组(元素个数3)类型。即ptr指针数组是数组元素为3个指针的数组,其本质是数组,类型为int *[3],ptr[0]指向&data0,ptr[1]指向&data1,ptr[2]指向&data2。

 

由于ptr声明为指针数组,因此ptr[0]返回的是一个地址。当用*ptr[i]解引用指针(i=0~2)时,则得到这个地址的内容,即*ptr[0]==1,*ptr[1]==2,*ptr[2]==3。当然,也可以使用等价的指针表示法,ptr+i表示数组第i个元素的地址。如果要修改这个地址中的内容,可以使用*(ptr+i)。如果对**(ptr+i)解引用两次,则返回所分配的内存的位置,即可对其赋值。比如,ptr[1]位于地址&ptr[1],表达式ptr+1返回&ptr[1],用*(ptr+1)则得到指针&data1,再用**(ptr+i)解引用得到&data1的内容"1"。由此可见,使用指针的指针表示法,让我们知道正在处理的是指针数组。

 

显然,只要初始化一个指针数组变量保存各个字符串的首地址,即可引用多个字符串:

char * keyWord[5] = {"eagle", "cat", "and", "dog", "ball"}; 

 

其中,keyWord[0]的类型是char*,&keyWord[0]的类型是char **。虽然这些字符串看起来好像存储在keyWord指针数组变量中,但指针数组变量中实际上只存储了指针,每一个指针都指向其对应字符串的第一个字符。也就是说,第i个字符串的所有字符存储在存储器中的某个位置,指向它的指针存储在keyWord [i]中,即keyWord [0]指向""eagle""、keyWord [1]指向""cat"",keyWord[2]指向 "ant",keyWord[3]指向 "dog",keyWord[4]指向 "ball"。

 

尽管keyWord的大小是固定的,但它访问的字符串可以是任意长度,这种灵活性是C语言强大的数据构造能力的一个有力的证明。由于指针数组是元素为指针变量的数组,因此一个字符指针数组可以用于处理多个字符串。显然,将字符串制成一个表存放于指针数组的话,比使用switch语句效果更好。由此可见,数据的随机存储会以两种形式保存:存址和存值,存址方式详见图 1.14。一个数组包含了指向实际信息的指针,而不是直接将信息存储在数组元素的存储空间里。使用这种方式,可以灵活地存储和排序任何复杂结构的数据。

 

图 1.14 存址方式

 

相反地,基于值的存储将n个元素的数据集合打包存储在固定大小的记录块中,这个固定大小为s,存值方式详见图 1.15,每个字符串占用大小为6字节的连续存储块。

 

图 1.15 存值方式

 

为了便于说明多个字符串的引用,将设计一个数据交换函数。由于任何数据类型的指针都可以给void*指针赋值,因此可以利用这一特性,将void*指针作为byte_swap()函数的形参,即可接受任何类型数据。

 

由于C中最小长度的变量为char类型(包括unsigned char、signed char等),其sizeof(char)的结果为1,而其它任何变量的长度都是它的整数倍。比如,在32位系统中,sizeof(int)为4。由于C语言的变量类型多种多样,因此不可能为每一种变量类型编号,而且swap也并不关心变量的真正类型,所以可以用变量的长度代替变量类型。byte_swap函数原型为:

void byte_swap(void *pData1, void *pData2, size_t stSize); 

 

其中,size_t是C语言标准库中预定义的类型,专门用于保存变量的大小。stSize为变量的长度,pData1、pData2分别为是要比较的第1、2个参数。当返回值< 0时,表示pData1 < pData2;当返回值= 0时,表示pData1 = pData2;当返回值> 0时,表示pData1 > pDta2。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top