1. 内存四区
a).代码区。代码
b).全局区。
c).栈区。系统自动开辟,自动释放。并不是很大。
d)堆区。动态开辟的内存。手动开辟,手动释放。大
什么链表,各种数据结构,动态数组都在这一个区域
2. 地址
定义:把内存以单个字节为单位,分开。对每一个字节编号,这个编号就是地址。
a) 编号是连续的。
b) 唯一的。
c) 取地址运算符:&单目运算符 优先级()[]。 结合性右往左。
int a; //a 一个内存
&a;
3. 首地址
一段内存空间中第一个存储单元(指最大的单元)的地址。存储单元。
4. 指针变量
4.1 指针变量的定义:
数据类型 *变量名;
int *p; //定义一个指针变量p。存的是地址!!
//int 指明指针指向的数据类型
//*指明p这个变量是一个指针变量
4.2 指针变量的特点
1.用来存放地址的变量。2.内存大小4B
地址是一些编号,一种数据。
整数 int a;
字符 char c;
小数 float b;
地址 指针变量。
4.3 指针变量的赋值
P = &a; //p指向a
4.4 指针变量的引用
访问a这个int变量:
- 使用变量名:
- 指针访问:指针变量。取值运算符。返回某一个地址中的值。单目运算符 右到左。
注意了:*在定义指针变量的时候int *p; *只是表明p是一个指针变量。非定义,p; 取值p指向的内存值。
4.5 指针变量的运算
-
- ++ – 指针偏移,去访问地址旁边的一些内存。
指针变量的加减,以指针所指向的类型空间单位进行偏移。
- ++ – 指针偏移,去访问地址旁边的一些内存。
char *p; //p char 1 p+1 1B
int *p1; // int 4 p1+1 4B
double *p2;// double 8 p2+1 8B
一段内存空间中第一个存储单元(指最大的单元)的地址。存储单元。
指针变量的加减,以指针所指向的类型空间单位进行偏移。
4.6 关于指针变量的两个概念
野指针:不能明确指向的指针变量。危险。
int p; //p里面保存的地址不确定, p指向是不明确的。重要数据。
int p = NULL;
空指针:int float char* double*
void* 转换成其他的数据类型。
动态内存分配。malloc(函数) new(字符)
5. 一维数组与指针
- 定义一个一维数组,数组名是这个数组的《首地址》。
int a[5];
//a 指向 a[0], a[0]int 的元素, a的类型就是 int*
//&a这个地址指向整个数组 &a 的类型 int(*)[5];
- 访问数组的元素
下标法:
for (int i = 0; i < 5; i++)
{
printf("%d", a[i]);
}
指针法:
(一)
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *p = a; //p指向a[0]
//*p; //a[0]
//*(p + 1); //a[1]
//*(p + 2); //a[2]
for (int i = 0; i < 5; i++)
{
printf("%d", *(p + i));
}
return 0;
}
(二)
int a[5] = { 1, 2, 3, 4, 5 };
int *p = a; //p指向a[0]
for (int i = 0; i < 5; i++)
{
printf("%d", *p++ ); //与前面的区别是p的值发生改变
}
(三)
int a[5] = { 1, 2, 3, 4, 5 };
for (int i = 0; i < 5; i++)
{
printf("%d", *(a+i)); //a是数组名,把a看成指针常量。
//a不可随意改动,不可用a++方式访问
}
总结:数组名不能够随意改变。不能改变。会报错。
6. 二维数组与指针
int a[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
数组名:a
a是二维数组的首地址:首地址???
a指向二维数组的第一个存储单元:
a是指向a[0]这个一维数组。a的类型是什么?
int(*)[4]; a + 1 16B
a[0]是什么? 是一维数组的数组名。
a[0]指向a[0][0]这个元素; a[0]的类型是什么?
int* a[0]+1 4B
&a; int(*) [3][4]; &a+1 48
6.1 访问m行n列的元素(三种)
(一)
a[m][n];
(二)
*(a[m]+n);
(三)
*(*(a+m)+n)
//a指向a[0]
//a+1指向a[1];
//*(a+1)
7. 几个操作对应的类型
int a[3][4];
a int(*)[4];
&a int(*)[3][4];
a[0] int*
a[0][0] int
8. 拓展到多维思想
从高到低去拆(例子8维数组)
&a //指向8维
a
a[0]
a[0][0]
a[][][] int(*)[][][]
a[][][][] int(*)[][]
a[][][][][] int(*)[]
a[][][][][][] int*
a[][][][][][][] int
指针数组:int*[]
数组指针:int(*)[]