1.数组的指针与数组元素的指针
数组元素的指针是指数组中某个具体元素的地址。数组的指针则是数组的首地址,也叫起始地址,是数组中最开头那个元素的地址。C语言程序中,数组名本身就代表该数组的首地址。
例7.5
程序运行结果如下:
从本例题中可以看出a和&a[0],b和&b[0]是同一个值。因为a,b为数组名,分别代表数组a和数组b的首地址,事实上,数组a和数组b的首地址就是&a[0] 和&b[0]的值。由于数组中各元素是按顺序存放的,a+1表示a数组中下一个元素的地址(指针),也就是说,a+1 和&a[1]是同一个值。
2.指向数组元素的指针变量的定义与赋值
定义一个指向数组元素的指针变量的方法一般如下:
类型说明符 数组名[常量表达式];
类型说明符*指针变量名;
例如:
注意:
必须保证数组类型和指针变量所指向的变量类型保持一致。如果数组为int型,则指针变量应指向int型;如果数组为float型,则指针变量应指向float型。
对指向数组的指针变量赋值有两种方法:将数组的地址赋给指针变量和将数组元素的地址赋给指针变量。
例如:
可以在定义指针变量时,给指针变量赋初值。
例如:int a[10];
int *p=a;
3.指针法引用数组元素
假定:
那么:
①a代表数组a的首地址&a[0],p的值也是&a[0],*p和*a则表示a[0]。
②a+1的值是&a[1],p+1的值也是&a[1],*(a+1)和*(p+1)则表示a[1]。
③a+i的值是&a[i],p+i的值也是&a[i],*(a+i)和*(p+i)则表示a[i]。由此可以推断出:a[i]和*(a+i)等价,a+i和&a[i]等价;p[i]和*(p+i)等价,&p[i]和p+i等价。所以,引用数组元素有两种方法:
上述文字可用图7-6来形象地表示。
图7- 6
④数组中元素a[i]的实际地址为:a+i*d,d为一个数组元素所占的字节数。
例如:如果a=2001;则元素a[5]的实际地址为2001+5*2,即2011。因为一个int型数据占2个字节。
⑤p是指针变量,可以进行递增和递减运算,例如:p++;p--;是合法的,但a不能进行递增和递减运算,例如:a++;a--是非法的。因为a是数组名,代表首地址,在程序中是固定不变的,不能进行递增和递减运算。
例7.6 用指针法输入输出数组元素的值。
程序如下:
程序运行结果如下:
上面程序中,a为数组名,代表该数组的首地址,是一个常量。a的值是不能够随意改变的,因此不能出现a++或++a。
例7.6的程序可以写成下面的指针法形式,其结果仍然不变。
程序如下:
程序运行结果如下:
例7.6的程序还可以写成下面的指针法形式,其结果也是不变的。
程序如下:
程序运行结果如下:
程序中,p++表示指针变量p使用完毕后,指向下一个数组元素。*(p++)表示先得到*p的值,然后使p指向下一个数组元素。
例7.7 用冒泡法对数组进行从小到大排序。
前面讲过用下标法对数组进行冒泡法排序,现在可以用指针法来进行冒泡法排序。
程序如下:
程序运行结果如下:
另外 例7.7中的程序还可以写成下面的形式,其结果仍然不变。
程序如下:
程序运行结果如下:
在C语言程序中,数组名代表该数组的地址,可以用数组名或指向数组的指针变量作为函数的参数。所以,例7.7中的程序还可以写成下面的形式,其结果仍然不变。
程序如下:
程序运行结果如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。