昨天知道了指针是C语言中的大哥大,马上就能见识到指针为什么能坐上这样的高位了
不是有多厉害呢我还真不信,展开说说
我们来继续看看二级指针
一.二级指针:
1.定义:
二级指针就是指向一个指针变量存储首地址的指针
2.使用:
应用于函数体内想要修改函数体外部指针变量值时
-
传递二级指针给被调函数,取解后就可以操作对应空间的指针变量了
-
我们可以使其指向空间发生改变
-还可以通过对一级指针再取解然后去操作对应空间的数据

void指针
1.void指针只表示一个内存地址,通常作用于函数传参与函数返回值
来看个例子: -
void p
-
- 只保留了指针变量首地址 ,使P只有地址数据,没有内存大小
-
- 不用于算数运算与取解操作
-
- 传参时可以兼容不同的指针类型

volatile指针
- 传参时可以兼容不同的指针类型
-
volatile int * paddr
-
volatile int num
volatile关键字作用
- 搭配指针与变量使用,表示变量或者指针指向空间中的数据容易被改变
- 防止编译器优化代码,每次读写代码都会在内存中去存取变量值
就这也能叫大哥大???我还以为多厉害呢
别着急,更厉害的在后边呢,大哥要跟咱们动真格的了
二.数组指针与指针数组
首先明确
- 数组指针就是指针,指针指向了整个数组
- 指针数组是数组,其中的每个元素都是指针
1.指针数组
1.定义:
- int *a[5] = {NULL};
定义了一个数组a,其中每个元素都是int* 型的指针,a是他的数组名,这个数组共占:
5(元素个数)* 8(指针变量内存空间大小)个字节大小
要明确:指针数组的数组名就是是一个二级指针,因为我们的数组名是指向数组第一个元素首地址的指针常量
我们的指针数组常用来操作字符串数组即我们的二维字符型数组
看看它的应用
const char *pstr[5] = {“one”,“two”,“three”,“four”,“five”}
int i = 0;
scanf(“%d”,&i);
printf(“%s\n”,pstr[i-1]);
这样我们就可以根据我们的指针数组名来直接访问我们指针数组指向空间中的数据了

2.数组指针
数组指针是一个指针,占8个字节大小,这个指针指向了一个数组
数组的数组名就是指向数组第一个元素首地址的指针
在整型数组中我们可以将它理解为int*型的指针
但在一下两种情况时不能这么理解
1.使用sizeof关键字时:
sizeof(a) == 20;
但是:
sizeof(int*) == 8
2.对数组名再取地址时:
&a = int(*)[5] ;a的值不变,但是类型会升级为指向整个数组的数组指针
但是
& int* = int ;会类型升级为int**
3.数组指针也多用于我们二维字符型数组传参

二维数组的数组名是指向数组第一个元素首地址的数组指针(行指针)
存储空间涵盖这一行所有元素
- 定义:int (*)[数组列数]
同样的对二维字符型数组的数组名再取解也会使其类型降级为存储空间变为四个字节大小的一级指针
数组指针p如果和我们二维数组名指向了同一个地址
我们就可以通过
p[m][n]去访问二维数组中的第m行第n列的元素
-
a[m][n] -
*(a[m] + n) -
*(*(a+m)+n) -
*(p + m * N(列数) +n ) -
*(*(a+m) + n) -
* ( p[m] + n) -
p[m][n]
使p指向a[0][0]的操作
-
p = &a[0][0] -
p = a[0]; -
p = *a;
通过一张图来了解

最后的:
数组的本质就是 :
数组给定了一个首地址与固定的存储空间
通过数组指针的类型与首地址的结合运算来对数据进行存储与改变

3680

被折叠的 条评论
为什么被折叠?



