数组指针与指针数组
动态数组
扩容:空间不够,重新申请2倍大小的连续
空间,拷贝元素后,释放旧空间
动态数组区别于静态数组,其不具备begin(),end()操作
c++
//动态一维数组
int n = 10;
int *a = new int[n];//可以输入n值,不固定
for (int i = 0; i < n;i++)
a[i] = rand() % 100;
for (int i = 0; i < n;i++)
cout << a[i] << " ";
由于普通类型int,double没有指向首尾字符的指针,需要借助end(),begin()函数
c++
int b[10];
for (int i = 0; i < 10;i++)
b[i] = rand() % 100;
//迭代器遍历,只有静态数组有
for (auto it = begin(b); it != end(b);it++)
cout << (*it)<< " ";
或者直接使用静态数组名
c++
int a[5] = {1, 6, 7, 9, 4};
for(auto v:a)
cout << v << " ";
初始化
c++
//动态一维数组
int n = 5;
double *p = new double[n]{1.1, 2.2, 3.3, 4.4, 5.5};
for (int i = 0; i < n;i++)
cout << p[i] << " ";
cout << endl;
//动态字符串
string *s = new string[n]{"aa", "bb", "cccc", "d", "eee"};
for (int i = 0; i < n;i++)
cout << s[i] << " ";
数组指针和指针数组
c++
int arr[] = {1, 2, 3,4};
//arr=&arr=&arr[0]
cout << " arr:" << arr << endl;
cout << " &arr:" << &arr << endl;
cout << "&arr[0]:" << &arr[0] << endl;
int *pa = &arr[1];//指向数组第2个元素
//arr = arr + 1;--arr的地址不可以改变
pa = pa + 1;
cout << (*pa) << ":"<< pa[1] << endl;//结果是:3,4
数组类型的指针
数组元素的类型 (*指针名)【】=&数组名
c++
int arr[] = {1, 2, 3,4};
//必须加(),因为[]优先级高于*
//(*parr)---这是一个指针
//(*parr)[]---是一个数组类型的指针
//int (*parr)[]---这个数组里面元素的类型是int
int(*parr)[] = &arr;
for (int i = 0; i <4;i++){
//只需要访问下标改变,不需要指针自己的改变
cout << (*parr)[i] << " ";
数组指针指向多个元素数组
首先: int (*p)[数组元素个数]=数组名
ABAP
比如:arr[m][n],如果一个(*p)[]指向它,那么[]的大小为n
--
访问时候:P[i][j]等价于*(*(p+i)+j) 注意:*(p+i)
c++
int aa[3][4] = {
{1, 2, 3, 4},
{22, 33, 44, 55},
{77, 88, 99, 100}};
int(*p)[4] = aa;//[]内是数组元素的个数,每一行
for (int i = 0; i < 3;i++){
for (int j = 0; j < 4;j++){
cout << *(*(p + i) + j) << " ";
}
cout << endl;
}
for (int i = 0; i < 3;i++){
for (int j = 0; j < 4;j++){
cout <<p[i][j]<< " ";
}
cout << endl;
}
元素是指针的数组
数据类型* 数组名【】
c++
int a = 100;
int b = 200;
int c = 300;
//arr[]是一个数组
//int*---arr[]数组每一个元素是指针
int *arr[] = {&a,&b,&c};
for (int i = 0; i < 3;i++)
cout << *arr[i] << " ";
扩展---一个数据类型是数组的指针,而且数组元素是指针类型
-
首先得存在一个元素类型是指针的数组:int* arr[]
-
然后定义一个类型为数组的指针指向它:int* (*parr)[]=&arr;
c++(*parr)[i]=arr[i]=&i i=*(&i)=*((*parr)[i])
c++
int a = 11, b = 22, c = 33;
int *arr[] = {&a, &b, &c};
//定义一个指向arr的元素类型为数组的指针
int *(*parr)[] = &arr;
// 想通过parr访问元素
//(*parr)[0]=&b;
//b=*(&b)=*(*parr[0])
for (int i = 0; i < 3;i++)
cout << *((*parr)[i]) << " ";
动态二维数组
c++
int n =4;
//**arr是指针的指针,然后指向了一个指针数组(数组里的元素全是指针)
//然后把这个数组里面的每一个指针,动态创建一个一维数组
int **arr = new int*[n];
for (int i = 0; i < n;i++)
arr[i] = new int[n];
定义了一个指向指针数组的双重指针arrayPtr
元素数据类型为 int* 的数组 int*[ ]
c++//赋值和遍历 for (int i = 0; i < n;i++){ for (int j = 0; j < n;j++){ arr[i][j] = rand() % 100; } } for (int i = 0; i < n;i++){ for (int j = 0; j < n;j++){ cout<<arr[i][j]<<" "; } cout << endl; }
利用new去创建可输入值的指针数组
int (p)[m]=new int[n] [m] 这里:n就是P的个数
c++
int n = 5;
int(*p)[4] = new int[n][4]; // 先行后列
for (int i = 0; i < n; i++)
for (int j = 0; j < 4; j++)
p[i][j] = rand() % 100;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 4; j++)
{
cout << *(*(p + i) + j) << " ";
}
cout << endl;
}