对一维数组的引用,既可以用传统的数组元素的下标法,也可使用指针的表示方法。例7.11输入10个数,采用指针变量表示的地址法输入输出数组各元素。由于数组元素在内存是连续存放的,若给指向整型变量的指针传递数组的首地址,则该指针指向二维数组。#include<stdio.h>例7.16用指针法输入输出二维数组各元素。......
2025-09-30
当指针变量指向一维数组的首元素时,称为指向了一维数组。由于数组名表示数组的起始地址(即第一个数组元素的地址),所以,如有定义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(https://www.chuimin.cn)
After Sort:
825 761 552 484 413 366 259 55 30 7
相关文章
对一维数组的引用,既可以用传统的数组元素的下标法,也可使用指针的表示方法。例7.11输入10个数,采用指针变量表示的地址法输入输出数组各元素。由于数组元素在内存是连续存放的,若给指向整型变量的指针传递数组的首地址,则该指针指向二维数组。#include<stdio.h>例7.16用指针法输入输出二维数组各元素。......
2025-09-30
在C++中,数组和指针密切相关,几乎可以互相使用。数组名字可以认为是常量指针,它指向存放数组第一个元素的内存地址。指针可以用于完成任何涉及数组下标的操作。实际上,数组下标表示法在编译期间将转换为指针表示法,所以用指针方式来书写数组下标表达式可以节省编译时间。如果再定义一个字符指针:char*pname=name;则name[i]、*和*具有相同的值,都是数组第i+1个元素的值。分析以下程序的执行结果。......
2025-09-30
void类型指针中的数据不能访问,如果非要访问的话,可以通过强制转换将void类型指针转换为与所指向的数据类型相符的类型。所谓“相同存储对齐限制”是指void类型指针所指的数据在内存中所占的长度与显式转换后的指针所指的数据在内存中所占的长度相等。同理,如果是将void类型转换为具有更小存储对齐限制的指针时,也可能引起数值的改变。......
2025-09-30
在前面的章节中已经讨论过整数的产生方法,本小节以数组为载体进一步讨论产生随机数的技术。为了能够在程序中随机生成数据,需要使用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位以内的随机整数。......
2025-09-30
图6.3二维数组a[3][4]示意图多维数组定义的一般形式为:数据类型符数组名[常量表达式][常量表达式]…图6.4二维数组存储示意图图6.5三维数组存储示意图根据多维数组在存储器中按行存储的规则和多维数组的行列顺序可以计算出多维数组元素存储时在线性连续存储单元中的排列序号。......
2025-09-30
从二维数组的角度看,数组名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 列的地址。......
2025-09-30
,常数n};例如:int a1[5]={1,2,3,4,5};一维数组的初始化可以用以下方法实现:①数组初始化时,给出全部数组元素的初始值。②输出数组元素值。......
2025-09-30
一个函数直接或间接地调用自己,称为函数的递归调用。所以函数递归调用的实现必须依靠系统提供一个特殊部件(堆栈)存放未完成的操作,以保证当递归调用结束回溯时不会丢失任何应该执行而没有执行的操作。为了理解函数递归调用的特性,参照例5.9的程序讨论函数递归调用的执行过程,为了讨论方便为程序加上行号。函数递归调用示例。......
2025-09-30
相关推荐