数组和指针
指向数组元素的指针
一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用内存单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素,所谓数组元素的指针就是数组元素的地址。
int a[10]; //定义一个整型数组
int *p; //定义一个基类型为整型的指针变量
p=&a[0]; //将元素a[0]的地址赋给指针变量p,使p指向a[0]
在C和C++中,数组名代表数组中第一个元素的地址,因此下面两个语句是等价的。
p=&a[0];
p=a;
需要注意的是,数组名a不代表整个数组。
可以通过指针引用数组元素,如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。
引用一个数组元素,可以用以下方法
1、下标法,如a[i]形式。
2、指针法,如*(a+i)或*(p+i)。其中a是数组名,p是指向数组元素的指针变量,如果已使p的值为a,则*(p+i)就是a[i]。
例1:输出数组中的全部元素。
1、下标法
#include <iostream>
using namespace std;
int main()
{
int a[5];
cout << "请输入5个整数:";
for (int i = 0; i < 5; i++)
cin >> a[i];
cout << endl;
cout << "输出数组a的数据:";
for (int i = 0; i < 5; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
2、指针法
#include <iostream>
using namespace std;
int main()
{
int a[5];
cout << "请输入5个整数:";
for (int i = 0; i < 5; i++)
cin >> *(a + i);
cout << endl;
cout << "输出数组a的数据:";
for (int i = 0; i < 5; i++)
cout << *(a + i) << " ";
cout << endl;
return 0;
}
3、用指针变量指向数组元素
#include <iostream>
using namespace std;
int main()
{
int a[5];
int i, * p = a;
cout << "请输入5个整数:";
for (i = 0; i < 5; i++)
cin >> *(p + i);
cout << "输出数组a的数据:";
for (p = a; p < (a + 5); p++)
cout << *p << " ";
return 0;
}
以上输出结果如下:

在用指针变量指向数组元素时要注意,指针变量p是被定义为指向整型的对象,它可以指向整型的数组元素,也可以指向数组以后的内心单元,在使用指针变量指向数组元素是,应切实保证指向数组中有效的元素。
用指针变量作函数形参接收数组地址
用数组名作函数参数,数组名代表数组首元素地址,传递的也是数组首元素地址。
用指针变量作函数形参,同样可以接收从实参传递来的数组首元素的地址。
例2:将5个整数按由小到大的顺序排列
#include <iostream>
using namespace std;
int main()
{
void select_sort(int* p, int n);
int i, a[5];
cout << "请输入5个整数:";
for (i = 0; i < 5; i++)
cin >> a[i];
select_sort(a, 5);
cout << "排序后数据为:";
for (i = 0; i < 5; i++)
cout << a[i]<<" ";
return 0;
}
void select_sort(int* p, int n)
{
int i, j, k, t;
for (i = 0; i < n-1; i++)
{
k = i;
for (j = i+1; j < n; j++)
if (*(p + j) < *(p + k)) k = j;
t = *(p + k);
*(p + k) = *(p + i);
*(p + i) = t;
}
}
结果如下:

C++编译系统将形参数组名一律作为指针变量来处理。
在函数调用时并不存在一个占有存储空间的形参数组,只有指针变量。
需要注意的是,实参数组名a代表一个固定的地址,或者说是指针型常量,不能改变a的值。而形参数组名是指针变量,并不是一个固定的地址值,它的值是可以改变的。
用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素,但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。

被折叠的 条评论
为什么被折叠?



