二级指针是指向指针的指针。
指针是一个变量,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; }
|