指针5

多级指针

野指针

未赋值直接使用

image-20231113105206765

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"

int main(int argc, char* argv[])
{
char* p1;
char** p2;
char*** p3;
char**** p4;
char***** p5;

printf("%d",*p1);//*(p+i==p[i])
printf("%d",*(p1+0));
printf("%d",p1[0]);

getchar();
return 0;

}

image-20231113105246616

多级指针

多级引用,在编译器眼中,指针取值用*和用[]完全一致,汇编代码没有任何区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "stdafx.h"

int main(int argc, char* argv[])
{


int i = 100;

int* p1 = &i; //一级指针

printf("%d\n",*(p1));

printf("%d\n",*(p1+0));

printf("%d\n",p1[0]);


int** p2 = &p1; //二级指针

printf("%d\n",*(*(p2)));
//p2是int**类型,*(p2)就是int*类型,*(*(p2)) 就是int类型

printf("%d\n",*(*(p2+0)+0));
//p2+0等于p2+0*4

printf("%d\n",p2[0][0]);


int*** p3 = &p2;//三级指针

printf("%d\n",*(*(*(p3))));

printf("%d\n",*(*(*(p3+0)+0)+0));

printf("%d\n",p3[0][0][0]);



getchar();
return 0;

}

image-20231113105504212

数组指针

int *px[5]

这个语句定义了一个数组,数组中每个元素都是一个指向 int 类型变量的指针。px 本身是一个指向由 5 个指针元素组成的数组的指针。例如,下面的代码定义了一个 int 指针数组 px,其中包含 5 个元素:

1
int *px[5];

以上语句定义一个大小为 5 的指针数组,每个元素的类型都是 int *,即指向 int 类型的指针。可以使用下标操作符 [] 访问数组元素,例如 px[0]、px[1]、px[2] 等。

int (*px)[5]

这个语句定义了一个指针,这个指针指向一个包含 5 个 int 类型元素的数组。例如,下面的代码定义了一个 int 数组 arr,其中包含 5 个元素,然后定义了一个指向该数组的指针 px:

1
2
int arr[5];
int (*px)[5] = &arr;

以上语句定义了一个 int 数组 arr,然后定义了一个指向该数组的指针 px。px 指向的是 arr 数组的首地址,因此可以使用 px(或 px[0])访问数组元素,例如 px[0]、px[1]、px[2] 等

特性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "stdafx.h"

int main(int argc, char* argv[])
{

int arr[5]={1,2,3,4,5};

int (*p)[2];

p=(int (*)[2])arr;

printf("%p\n",p);

getchar();
return 0;

}

image-20231113105540823

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"

int main(int argc, char* argv[])
{

short arr[8]={1,2,3,4,5,6,7,8};

short (*p)[2];

p=(short (*)[2])arr;

printf("%d\n",*(*(p+2)+1));
//p指向1,p是short (*)[2]类型,+2去掉星号是short[2]类型,长度是4,乘以二等于8.八字结会让*(p+2)指向5,再加一个,short[2]是数组类型,可以看作short*类型,在家两个字节到6

getchar();
return 0;

}

image-20231113105612918