二级指针

二级指针是指向指针的指针。

指针是一个变量,32系统占4个字节,64位系统占8个字节。

一级指针使用,如

char*p = "abcdef";    //p指向字符串的首地址
p[0]='x';         //报错,p指向的是字符串常量,在静态常亮去,不能修改
二级指针
1
2
3
int a = 10;
int *p = &a;
int **pp = &p;

二级指针pp指向的是指针p,而指针p存放的是一个int类型的值

改变一级指针指向可以改变二级指针的值
1
2
3
4
5
6
7
8
9
int a = 10;
int b = 20;

int *p = &a;
int **pp = &p;
printf("%d\n", **pp);

p = &b;
printf("%d\n", **pp);

输出结果为:
10
20

二级指针作为函数形参来初始化一级指针
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int allocSpace(char**p, int n)
{
*p = (char*)malloc(n);
memset(*p, 0, n);
if (*p == NULL)
{
return -1;
}
return 0;
}
int main()
{
char*p = NULL;
allocSpace(&p, 10);
strcpy(p, "abcdef");

printf("%s\n", p);
return 0;
}
二级指针的步长

一级指针的步长为指针变量的类型大小,如int*p ,步长sizeof(int),对于二级指针,先看一段代码

1
2
3
4
5
6
char a = 10;
char *p = &a;
char **pp = &p;

printf("%p\n", pp);
printf("%p\n", pp+1);

运行结果:


二级指针指向的是一个一级指针,32位系统指针变量占4个字节,所以二级指针的步长是4字节

初始化二级指针,指向一个二维空间

例:int*指向一个34*int的二维空间

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
43
44
45
46
47
48
49
50
51
52
53
54
int alloc2dSpace(int ***p, int row, int line, int n)
{
*p = (int**)malloc(row*sizeof(int*));
if (*p == NULL)
{
return -1;
}
for (int i=0; i<row; i++)
{
(*p)[i] = (int*)malloc(line*sizeof(int));
if ((*p)[i] == NULL)
{
return -1;
}
}
}

void free2dSpace(int **p, int row)
{
for (int i=0; i<row; i++)
{
free(p[i]);
}
free(p);
}

int main()
{
int **pp = NULL;
alloc2dSpace(&pp, 3, 4, sizeof(int));

//给二维空间赋值
for (int i=0; i<3; i++)
{
for (int j=0; j<4; j++)
{
pp[i][j] = i+j;
}
}

//输出
for (int i=0; i<3; i++)
{
for (int j=0; j<4; j++)
{
printf("%d \t", pp[i][j]);
}
printf("\n");
}

//释放空间
free2dSpace(pp, 3);
return 0;
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×