Skip to content

二级指针

c
 #include <stdio.h>                                                                    
  2 
  3 int main(){
  4     int a = 10;
  5     int *p = &a;
  6     int **pp = &p;
  7     printf("   a: %d\n", a);
  8     printf("  *p: %d\n", *p);
  9     printf("**pp: %d\n", **pp);
 10     puts("");
 11 
 12     printf(" &a: %p   a: %d\n", &a, a);
 13     printf(" &p: %p   p: %p\n", &p, p);
 14     printf("&pp: %p  pp: %p\n", &pp, pp);
 15     puts("");
 16     return 0;
 17 
 18 }


result:

   a: 10
  *p: 10
**pp: 10

 &a: 0x7ffcfd66e2f4   a: 10
 &p: 0x7ffcfd66e2f8   p: 0x7ffcfd66e2f4
&pp: 0x7ffcfd66e300  pp: 0x7ffcfd66e2f8

作用

指针变量的值

C
  1 #include <stdio.h>                                                                    
  2 
  3 int a = 10;
  4 int b = 20;
  5 
  6 void change3(int **pp)
  7 {
  8     *pp = &b;//把指针指向b
  9 }
 10 
 11 int main(void){
 12     int *p = NULL;
 13     p = &a;
 14     printf("p = %d\n", *p);
 15     change3(&p);
 16     printf("*p = %d\n", *p);
 17     return 0;
 18 }

result:

p = 10
*p = 20

指针数组传参

实参可以匹配的参数
int a[5]int a[] int *p
int *a[5]int *a[] int **p
int a[3] [5]int a[] [5] int (*a)[5]
二级指针和指针数组
C
  1 #include <stdio.h>                                                                    
  2 
  3 char *season[4] = {"Spring", "Summer", "Autumn", "Winter"};
  4 
  5 void array_print(char *a[], int len)
  6 {
  7     int i;
  8     for(i = 0; i<len ; i++)
  9     {
 10         printf("%s\n", a[i]);
 11     }
 12 }
 13 void array_print2(char **a, int len)
 14 {
 15     int i;
 16     for(i=0; i<len ; i++)
 17         printf("%s\n", a[i]);
 18 }
 19 
 20 int main(void)
 21 {
 22     array_print(season, 4);
 23     puts("");
 24     array_print2(season, 4);
 25     return 0;
 26 }
 27 
 28   


result:


Spring
Summer
Autumn
Winter

Spring
Summer
Autumn
Winter

操作二维数组

二级指针和二维数组
  • *二维数组b[3][5]的指针指向的还是一个一维数组b[3],每个一元素的长度为5, 是一维数组int (p)[5]类型
c
  1 #include <stdio.h>                                                                    
  2 
  3 int b[3][5]={
  4     1, 2, 3, 4, 5,
  5     6, 7, 8, 9, 0,
  6     2, 2, 2, 2, 2
  7 };
  8 
  9 int main(void){
 10     int i, j;
 11     int (*p)[5];
 12     p = b;
 13     for(i = 0; i<3 ; i++)
 14     {
 15         for(j = 0; j< 5; j++)
 16             printf("%d ", p[i][j]);
 17         puts("");
 18     }
 19     return 0;
 20 }




result:


1 2 3 4 5 
6 7 8 9 0 
2 2 2 2 2
  • 二级指针操作二维数组
C
  1 #include <stdio.h>                                                                  
  2 
  3 int a[3][5] = {
  4     1, 2, 3, 4, 5,
  5     6, 7, 8, 9, 0,
  6     2, 2, 2, 2, 2
  7 };
  8 
  9 int main(void){
 10     int i, j;
 11     int (*p)[5];
 12     p = a;
 13     int (**pp)[5];
 14     pp = &p;
 15     for(i = 0; i<3 ; i++)
 16     {
 17         for(j = 0;j<5;j++)
 18             printf("%d ", (*pp)[i][j]);
 19         puts("");
 20     }
 21     return 0;
 22 }
  • 一级指针操作二位数组
C
  1 #include <stdio.h>                                                                    
  2 
  3 int a[3][5] = {
  4     1, 2, 3, 4, 5,
  5     6, 7, 8, 9, 0,
  6     2, 2, 2, 2, 2
  7 };
  8 
  9 int main(void){
 10     int i, j;
 11     int *pt = a[0];//一级指针只能指向一个地址, 所以等价于pt = &a[0][0]
 12     for(i = 0; i<3 ; i++)
 13     {
 14         for(j=0;j<5;j++)
 15             printf("%d ", *(pt +i*5 + j));
 16         printf("\n");
 17     }
 18     return 0;
 19 }