- 概念
- 元素类型角度:数组是相同类型的变量的有序集合
-
内存角度:联系的一大片内存空间
- 数组初始化
int a[10] = {1,2}; //其他初始化为0 指定长度
int b[] = {1, 2}; //不指定长度
注意点
- 数组名代表数组首元素的地址,是一个常量。(变量的本质是内存空间的别名,一定以数组,就分配好内存,所以数组名起名后不能修改)
-
数组首元素的地址和数组的地址值相等
- 数组类型
数组的类型由元素类型和数组大小共同决定 - 数组指针类型
- 通过数组类型定义数组指针
typedef int(ArrayType)[5]; //声明一个数组类型
ArrayType* pointer; //数组类型加* 定义一个数组指针变量
- 声明一个数组指针类型
typedef int (*MyPointer)[5]; //声明一个数组指针类型
MyPointer mypoint ;//用数组指针类型定义一个变量
- 直接定义:
int:指向数组的类型
pointer:数组指针变量名
n:指向数组的大小
int (*pointer)[n]; //直接声明一个数组指针变量
- 一维数组做函数参数,并改变其值
面试题21:调整数组顺序使奇数位于偶数前面 - 一维数组的那么坑
int a[5]={1,2,3,4,5};
(&a+1): 2293300
(&a):2293280
a:2293280
a+1:2293284
小结:a和&a都是数组首地址,a+1是数组第二位的地址,(&a+1)是以数组的长度为单位往后移动
实战
#include
#include
using namespace std;
int main()
{
int a[5]={1,2,3,4,5};
//int *ptr_1 = (int *)(&a);
//printf("%d\n",*ptr_1);
int *ptr=(int *)(&a+1);
printf("%d\n",*ptr);
//printf("%d,%d,%d,%d\n",(&a+1),(&a),a,a+1); //刚好差20个字符
printf("%d,%d",*(a+1),*(ptr-1)); 2 5
return 0;
}
- 多维数组
char a[i][j] = *(*(a+i)+j)
int b[10]://
int b[10]
b代表数组首元素的地址
&b代表数组的地址
&b+1指针后移4*10个单位
char cbuf[30]; //&cbuf(二级指针) 代表整个数组的地址
char array[10][30]
(array+i)相当于整个第i行的数组地址 即&cbuf
(*(array+i))一维数组的首地址 cbuf
(*(array+i))+j 相当于第i行第j列的地址 &array[i][j]
*((*(array+i))+j)相当于第i行第j列的地址的值 array[i][j]