c语言二级指针使用场景

模式一: 指针在栈中,指针指向静态常量区的一块内存

注意: 数组的输出都要带上数组里面存放数的个数,不然不知道输出多少个。因为传入参数的时候,数组名会自动变成指向数组的指针,无法通过sizeof获取数组的长度。

void two_point_test1(){
    char * a[] = {"asd","haha","你好"};
    two_point_test1_print(a, sizeof(a)/sizeof(a[0]));
}

//这里的num一定要传
void two_point_test1_print(char **p, int num){

    for (int i = 0; i < num; i++) {
        printf("%s\n", *(p + i));
    }
}
模式二:存放在栈中的二维数组

注意:这种输出不能使用 参数 char **p;因为如果参数数char**p,那么指针的跨度就是sizeof(char *),
而下面要的跨度是6,所有要把6传入参数中。

下面写法错误:
void two_point_test2_print(char **p, int num);

如下写法正确:
void two_point_test2_print(char p[][6], int num);
void two_point_test2_print(char *p[6], int num);

c语言常识: 指针的跨度即为去掉*p以外的sizeof, 上面的跨度为: sizeof(char[6])

void two_point_test2_print(char (*p)[6], int num){

    for (int i = 0; i < num; i++) {
        printf("%s \n", *(p + i));
    }
}
void two_point_test2(){

    char a[3][6] = {"sad","hahah","nimea"};
    two_point_test2_print(a, sizeof(a)/sizeof(a[0]));
}
场景三: 二级指针在栈中,同时指向堆中的一个数组,堆中的数组是一维数组,每一个数组元素指向堆中的一块内存
void two_point_test3_print(char **p, int num){
    
    for (int i = 0; i < num; i++) {
        
        printf("%s\n", *(p + i));
    }
    
}
//释放内存
void two_point_free(char **p, int num){
  
    for (int i = 0; i < num; i++) {
        free(*(p + i));
    }
   
    free(p); 
}

void two_point_test3(){

    char **p = NULL;
    p = calloc(3, sizeof(char *));
    
    for (int i = 0; i < 3; i++) {
        *(p + i) = calloc(10, sizeof(char));
    }
    
    for (int i = 0 ; i < 3; i++) {
        
        char b[10] = {0};
        sprintf(b, "hellow%d", i +1);
        strcpy(*(p + i),b);
    }
    
    two_point_test3_print(p, 3);
    two_point_free(p, 3);
    p = NULL;
}

你可能感兴趣的:(c语言二级指针使用场景)