指针和数组是有很多关系的,函数的形参可以是指针,返回类型也可以是指针,申请内存空间可以使用new关键字,也可以使用free释放内存空间
用指针访问数组元素
数组是一组连续存储的同类型数据,可以通过指针的算术运算,使指针依次指向数组的各个元素,进而可以遍历数组。
定义指向数组元素的指针
定义与赋值 例:int a[10], *pa; pa=&a[0]; 或 pa=a; 是等效的形式
经过上述定义及赋值后,(pa+1)的跨度是sizeof(int), *pa就是a[0],*(pa+1)就是a[1],... ,*(pa+i)就是a[i]. a[i], *(pa+i), *(a+i), pa[i]都是等效的。
不能写 a++,因为a是数组首地址、是常量。
使用数组名和下标访问数组元素
#include
using namespace std;
int main() {
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
for (int i = 0; i < 10; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
使用数组名和指针运算访问数组元素
#include
using namespace std;
int main() {
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
for (int i = 0; i < 10; i++)
cout << *(a+i) << " "; /
for (int i = 0; i < 3; i++) a[i] = new int[3];
//矩阵的转置
void swap(int&a, int&b) {
int temp = a;
a = b;
b = temp;
}
int main() {
//指向指针的指针
int **a;
a = new int*[3];
for (int i = 0; i < 3; i++)
a[i] = new int[3];
//int (*a)[3] = new int[3][3];
cout << "输入9个整数作为矩阵元素值" << endl;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
cin >> a[i][j];
cout << "初始矩阵:" << endl;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
cout << a[i][j] << ' ';
cout << endl;
}
for (int i = 0; i < 3; i++)
for (int j = 0; j < i; j++)
swap(a[i][j], a[j][i]);
cout << "转置后的矩阵:" << endl;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
cout << a[i][j] << ' ';
cout << endl;
}
return 0;
}
int main(){
int(*cp)[9][8] = new int[7][9][8];
for (int i = 0; i < 7; i++)
for (int j = 0; j < 9; j++)
for (int k = 0; k < 8; k++)
*(*(*(cp + i) + j) + k) = (i * 100 + j * 10 + k);
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 9; j++) {
for (int k = 0; k < 8; k++)
cout << cp[i][j][k] << " ";
cout << endl;
}
cout << endl;
}
delete[] cp;
return 0;
}
申请和释放动态数组示例:
class Point {
public:
Point() :x(0), y(0) { cout << "Default Constructor called." << endl; }
Point(int x, int y) :x(x), y(y) { cout << "Constructor called." << endl; }
~Point() { cout << "Destructor called." << endl; }
int getX()const { return x; }//常函数成员处理常对象
int getY()const { return y; }
void move(int newX, int newY) {
x = newX;
y = newY;
}
private:
int x, y;
};
class ArrayOfPoints { //动态数组类
public:
ArrayOfPoints(int size) :size(size) { points = new Point[size]; }
~ArrayOfPoints(){
cout << "Deleting..." << endl;
}
Point& element(int index) { //返回数组元素的引用
assert(index >= 0 && index < size);
return points[index];
}
private:
Point *points;//指向动态数组首地址
int size; //数组大小
};
int main(){
int count;
cout << "Please enter the count of points:";
cin >> count;
ArrayOfPoints points(count);//创建数组对象
//points.element(0)调用类函数,返回对象数组中的元素的引用,访问数组元素的成员
points.element(0).move(5, 0);
points.element(1).move(15, 20);//访问数组元素的成员
return 0;
}
vector动态数组对象:封装任何类型的动态数组,自动创建和删除。数组下标越界检查。
使用:vector<元素类型> 数组对象名(数组长度); vector arr(5) //建立大小为5的int数组
对数组元素的引用,与普通数组具有相同形式:vector对象名 [ 下标表达式 ]
vector数组对象名不表示数组首地址,获得数组长度,用size函数,数组对象名.size()
#include
using namespace std;
double average(const vector &arr) {//参数为vector常类型
double sum = 0;
for (unsigned i = 0; i < arr.size(); i++)
sum += arr[i];
return sum / arr.size();
}
int main(){
unsigned n;
cout << "n = ";
cin >> n;
vectorarr(n);//创建数组对象
cout << "Please input " << n << " real numbers:" << endl;
for (unsigned i = 0; i < n; i++)
cin >> arr[i];
cout << "Average = " << average(arr) << endl;
return 0;
}
基于范围的for循环配合auto举例:
vector v = { 1,2,3 };
for (auto i = v.begin(); i != v.end(); ++i) //基于范围的for循环配合auto举例
cout << *i << endl;
for (auto e : v)
cout << e << endl;



