数组指针与指针数组
动态数组
扩容:空间不够,重新申请2倍大小的连续
空间,拷贝元素后,释放旧空间
动态数组区别于静态数组,其不具备begin(),end()操作
//动态一维数组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()函数
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)<< " ";
或者直接使用静态数组名
int a[5] = {1, 6, 7, 9, 4};for(auto v:a)cout << v << " ";
初始化
//动态一维数组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] << " ";
数组指针和指针数组
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
数组类型的指针
数组元素的类型 (*指针名)【】=&数组名
int arr[] = {1, 2, 3,4};//必须加(),因为[]优先级高于*//(*parr)---这是一个指针//(*parr)[]---是一个数组类型的指针//int (*parr)[]---这个数组里面元素的类型是intint(*parr)[] = &arr;for (int i = 0; i <4;i++){//只需要访问下标改变,不需要指针自己的改变cout << (*parr)[i] << " ";
数组指针指向多个元素数组
首先: int (*p)[数组元素个数]=数组名
比如:arr[m][n],如果一个(*p)[]指向它,那么[]的大小为n
--
访问时候:P[i][j]等价于*(*(p+i)+j) 注意:*(p+i)
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;}
元素是指针的数组
数据类型* 数组名【】
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;
(*parr)[i]=arr[i]=&ii=*(&i)=*((*parr)[i])
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]) << " ";
动态二维数组
int n =4;//**arr是指针的指针,然后指向了一个指针数组(数组里的元素全是指针)//然后把这个数组里面的每一个指针,动态创建一个一维数组int **arr = new int*[n];for (int i = 0; i < n;i++)arr[i] = new int[n];
定义了一个指向指针数组的双重指针arrayPtr
元素数据类型为 int* 的数组 int*[ ]
//赋值和遍历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的个数
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;}