数组指针(点击访问B站视频)
1. 内存四区
1) 代码区:代码
2) 全局区:全局变量、静态变量以及常量
3) 栈区:系统自动开辟,系统自动释放。并不是很大。
4) 堆区:动态开辟的内存,手动开辟,手动释放。大。
2. 地址:把内存以单个字节为单位,分开。对每一个字节编号,这个编号就是地址。
a) 编号是连续(即地址是连续的)
b) 唯一的
c) 取地址运算符:& 单目运算符 优先级() [] 结核性:从右往左
int a; // a 一个内存
&a;
3. 首地址:一段内存空间中第一个存储单元的地址。存储单元。
4. 1)指针变量:
(1)用来存放地址的变量。
(2)内存大小4Byte(4字节)
地址是一些编号,一种数据:
整型 int a;
字符 char b;
小数 float c;
地址 指针变量 int *p;
2)指针变量的定义:数据类型 *变量名
int *p;//定义一个指针变量,存的是地址!!
//int 指明指针指向的数据类型
//*指明p这个变量是一个指针变量
char *p1;//p1保存一个字符型变量的地址
float *p2;//p2保存一个单精度浮点型变量的地址
3)指针变量的赋值
int a = 5, *p;
p = &a;//p指向a
cout << a << endl;//5
cout << "p指向的内存中的值:" << *p << endl;//5
cout << "p" << p << endl;//p006FF9A8
4) 指针变量的引用
访问a这个int变量
使用变量名
指针访问:*指针变量。*取值运算符。返回某一地址中的值。单目运算符,结合性:从右到左。
注意点:在定义指针变量的时候int *p;*只是表明p是一个指针变量。
5. 野指针:不能明确指向的指针变量。危险。
int *p;//p里面保存的地址不确定的,p指向是不确定的。重要数据
int *p = NULL;
6. 空指针:int* float* char* double*
void *转换成其他的数据类型。
动态内存分配 malloc new
7. 指针变量的运算:
+ - ++ -- 指针偏移去访问地址旁边的内存。
指针变量的加减,以指针所指向的类型空间单位进行偏移。
char *p; //char 1 p+1 1B
int *p1; //int 4 p1+1 4B
double *p2;//double 8 p2+1 8B
8. 一维数组与指针
(1)定义一个一维数组,数组名是这个数组的首地址。
Int a[5];
A指向a[0],a[0]int的元素,a的类型就是int *
&a 这个地址指向整个数组 &a类型 int(*)[5]
(2)访问数组元素
a. 下标法
int a[5] = { 1,2,3,4,5 };
for (int i = 0; i < 5; i++)
cout << a[i] << " ";
b. 指针法
不改变指针指向:
int a[5] = { 1,2,3,4,5 };
int *p = a;//p指向a[0]
//*p;//a[0]
//p + 1;//a[1]的地址
//*(p + 1);//a[1]
for (int i = 0; i < 5; i++)
cout << *(p+i) << " ";
改变指针指向:
int a[5] = { 1,2,3,4,5 };
int *p = a;//p指向a[0]
for (int i = 0; i < 5; i++)
cout << *p++ << " ";//* 和 ++优先级相同,结合性从右往左
//指针先移动后取值
法3:
int a[5] = { 1,2,3,4,5 };
for (int i = 0; i < 5; i++)
cout <<*(a+i) << " ";
//cout <<*a++ << " ";
//不可以使用*a++
//a是数组名 也是首地址,也是数组名不能够随意改变。不能改变,会报错
//a看成一个指针常量。看成,不是指针
9. 二维数组与指针
int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
数组名a
a指向a[0]这个一维数组。A的类型是 int (*)[4],a+1 则地址+16Byte (其中16=二维数组的列数*sizeof(int)) 相当于行指针;
a[0]指向a[0][0];a[0]的类型:int *,a[0]+1 4B
二维数组是由3个一维数组组成的,所以一位数组就是二维数组的一个存储单元。
a是二维数组的首地址。a是二维数组中第一个存储单元(一维数组)
&a; int (*) [3][4]; &a+1 48B=3*4*sizeof(int)
int a[2][3][4];
a指向二维数组
a[0]指向一位数组
a[0][0]指向一个元素。
i行j列的元素:
a[i][j]
*(a[i]+j)
*(*(a+i)+j)
a指向a[0]
a+1指向a[1]
a的类型: int (*)[4];
&a的类型: int (*)[3][4];
a [0] 的类型: int *
a [0][0] 的类型:int
10. 多维数组:从高到低拆
&a 指向8维
a
a[0]
a[0][0]
a[][][] int(*)[][][]
a[][][][] int(*)[][]
a[][][][][] int(*)[]
a[][][][][][] int *
a[][][][][][][] int
8维数组:
a[1][2][3][4][5][6][7][8];
a为数组名:
a指向7维数组
a[0]指向6维数组
a[0][0]指向5维数组
【指针的其他知识】:
指针数组:int *[]
数组指针:int(*)[]
函数指针
指针形参的函数:
结构体指针
字符串与指针:
指向指针的指针:
数据结构: