例如,有如下所示的C语句序列:则结构体指针变量p1指向结构体数组元素a[2],其关系如图10.2所示。此时应该注意到被指针变量p1指向的结构体数组元素本身是不能作为整体操作的,所以*p1也不能作为整体操作。......
2023-11-20
当指针变量指向一维数组的首元素时,称为指向了一维数组。由于数组名表示数组的起始地址(即第一个数组元素的地址),所以,如有定义a[10],*p;,则p=&a[0]和p=a都表示相同的意义:指针变量p指向a数组的第一个元素或称为指向数组a,如图8.4所示。
图8.4 指向一维数组的指针
一个指针变量指向一个特定数组后,在指针没有移动的情况下(即指针始终指向数组的0号元素),对该数组某个元素(如i号元素)的地址和元素值而言常用3种等价的表示形式,见表8.1。
表8.1 一维数组元素地址和元素值的等价表示形式
【例8.7】 使用不同的指针形式引用一维数组元素示例。
上面程序只是为了说明表8.2中3种对应关系,程序一次执行的结果是:第一次输入数据,使用指向数组的指针:
第二次输入数据,使用数组名:
在使用指针进行数组操作时还应特别注意,虽然使用数组名和指向数组的指针变量都可以表示对应的数组元素,但它们之间有一个根本的区别:数组名是地址常量,任何企图改变其值的运算都是非法的,如有定义:int a[5],*p;,则a=p、a++等操作都是错误的;而对于指针变量,其值是可以被改变的,例如:p=a、p++、p+=3等都是有意义的操作。
函数的数组形式参数本质上就是一个指针变量,用于接收传递过来的实参数组起始地址。所以,函数中一维数组形式参数可以用同类的指针形式参数替代;同理也可以用指向特定数组的指针变量来传递数组类实际参数。特别需要注意的是,函数的形式参数无论使用的是数组名形式还是指针变量形式,本质上都是一个指针变量,在被调函数中既可以将它当作数组名使用也可以将它当作指针变量使用。
【例8.8】 使用选择排序法将一组数据按降序排列,要求被排序数组用随机函数生成,排序功能在自定义函数内进行实现,并且要求函数的数组类形式参数和函数中对数组的操作都使用指针变量形式。
数组参数传递的方法和选择法排序的基本思想在4.3和4.4小节已经讨论过,请读者参照上述知识自行分析程序执行过程,程序的一次执行结果为:
Before Sort:
7 30 259 413 552 55 761 825 366 484(www.chuimin.cn)
After Sort:
825 761 552 484 413 366 259 55 30 7
有关C语言程序设计基础(第3版)的文章
例如,有如下所示的C语句序列:则结构体指针变量p1指向结构体数组元素a[2],其关系如图10.2所示。此时应该注意到被指针变量p1指向的结构体数组元素本身是不能作为整体操作的,所以*p1也不能作为整体操作。......
2023-11-20
图8.3用指针修改数组元素的值使用指针变量表示数组元素示例。另外,在输出数组值的操作中,首先让指针变量p指向数组0号元素,然后通过循环控制中的p++运算,使得指针变量p依次指向a数组的其他元素,通过*p的方式表达数组元素值。程序执行的结果为:0010000如果有两个指针变量分别指向同一个数组的两个不同元素,则两个指针变量之间的距离表示了它们之间的差距有多少个数组元素。......
2023-11-20
指针数组是一组有序的指针的集合。用一维指针数组处理二维数组示例。程序一次运行的结果为:11415019618955311556532879428指针数组还常用于处理若干个相关的一维数组,此时指针数组中的每个元素指向一个一维数组的首地址。上面程序综合使用了指针数组和二级指针变量,在数据对象的定义和初始化阶段完成后形成的处理结构如图8.9所示。......
2023-11-20
图6.3二维数组a[3][4]示意图多维数组定义的一般形式为:数据类型符数组名[常量表达式][常量表达式]…图6.4二维数组存储示意图图6.5三维数组存储示意图根据多维数组在存储器中按行存储的规则和多维数组的行列顺序可以计算出多维数组元素存储时在线性连续存储单元中的排列序号。......
2023-11-20
从二维数组的角度看,数组名array 代表整个二维数组的首地址,也是第0 行的首地址。所以,&array[i]和array+i 等价,都是指向二维数组的第i 行。array[i]+j 指向二维数组array[i][j]。*就是数组元素 array[i][j]的值。计算 array[i][j]在数组中的相对位置为“i×m+j”,*就是数组array[i][j]的值。使用指针变量输出二维数组任一行任一列元素的值。图6.12程序运行结果说明:在主函数中定义了一个指针变量p,指向数组array 第0 行第0 列。p+是二维数组array 第i 行第j 列的地址。......
2023-10-21
若在表中找不到与给定条件相符合的数据,则称为不成功的查找,给出提示信息或空位置信息。本节介绍最常用的两种查找方法:顺序查找和折半查找。③基准位置数据值与查找的关键字值不相符时,在两个子集合中选取一个,重复执行①、②,直到被处理的查找集合中没有数据为止。图6.11是在一有序序列中实现对key=21进行折半查找的过程。......
2023-11-20
void类型指针中的数据不能访问,如果非要访问的话,可以通过强制转换将void类型指针转换为与所指向的数据类型相符的类型。所谓“相同存储对齐限制”是指void类型指针所指的数据在内存中所占的长度与显式转换后的指针所指的数据在内存中所占的长度相等。同理,如果是将void类型转换为具有更小存储对齐限制的指针时,也可能引起数值的改变。......
2023-11-18
在前面的章节中已经讨论过整数的产生方法,本小节以数组为载体进一步讨论产生随机数的技术。为了能够在程序中随机生成数据,需要使用C语言提供的srand、rand和time 3个标准库函数。随机生成20个3位以内的整数序列存放在数组中,然后用每行10个数据的形式输出所有数组元素。程序一次运行结果为:6 73 796 864 999 12 881 293 634 453110 636 127 541 896 731 615 841 533 796在上面程序中,用表达式rand()%1000获取3位以内的随机整数。......
2023-11-20
相关推荐