模式一: 指针在栈中,指针指向静态常量区的一块内存
注意: 数组的输出都要带上数组里面存放数的个数,不然不知道输出多少个。因为传入参数的时候,数组名会自动变成指向数组的指针,无法通过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;
}
网友评论