二级指针数组(传智-王保明)
二级指针内存模型图
1数组名
//二维数组也是线性排列的 |
void printArray(int *a, int size) { int i = 0; printf("printArray: %d\n", sizeof(a)); for(i=0; i<size; i++) { printf("%d\n", a[i]); } } int main() { int a[2][3] = {{1, 2, 3}, {4, 5, 6}}; char cc[10][30]; int* p = &a[0][0]; printf("sizeof(&a):%d \n", sizeof(&a)); printf("sizeof(a):%d \n", sizeof(a)); printf("sizeof(*a):%d \n", sizeof(*a)); printf("sizeof(&cc):%d \n", sizeof(&cc)); printf("sizeof(cc):%d \n", sizeof(cc)); printf("sizeof(*cc):%d \n", sizeof(*cc)); //printArray(p, 6); getchar(); return 0; } |
2、本质分析 //int a[5] 一维数组名代表数组首元素的地址 //int a[5] ===> a的类型为int*
//二维数组名同样代表数组首元素的地址 //int b[2][5]===>b的类型为int(*)[5]
//测试如何测试:指针也是一种数据类型,它的数据类型是指它所执行的内存空间的数据类型 //如何测试b的步长? //推导。。。。。。。
|
//结论:二维数组名 char cc[10][30] 是一个数组指针,char (*)[30] |
2多维数组做函数参数退化
1、 C语言中只会以机械式的值拷贝的方式传递参数(实参把值传给形参) |
int fun(char a[20], size_t b) |
原因1:高效 |
原因2: |
2、二维数组参数同样存在退化的问题 |
二维数组可以看做是一维数组 二维数组中的每个元素是一维数组 二维数组参数中第一维的参数可以省略 void f(int a[5]) ====》void f(int a[]); ===》 void f(int* a); void g(int a[3][3])====》 void g(int a[][3]); ====》 void g(int (*a)[3]); |
3、等价关系 |
数组参数 等效的指针参数
一维数组 char a[30] 指针 char* 指针数组 char *a[30] 指针的指针 char **a 二维数组 char a[10][30] 数组的指针 char(*a)[30] |
char * a[30] char(*a)[30] char(*a)(30) 怎么区分:指针数组、数组指针 |
3数组指针
4野指针
//1初始化的是定义指针变量的时候,指针变量赋值成null //2 释放的时候,判断是不是null //3 释放完毕以后再赋值成null |
char ** spitString_Creat(int mycount) { int i = 0; char **myarray = NULL; if (mycount > 1000) { return NULL; } myarray = (char **)malloc(mycount*sizeof(char *)); if (myarray == NULL) { return NULL; } for (i=0; i<10; i++) { myarray[i] = (char *)malloc(100); } return myarray; } void spitString05_free(char **myarray, int ncount) { int i = 0; if (myarray == NULL) { return ; } for (i=0; i<ncount; i++) { if (myarray[myarray] != NULL) free(myarray[i]); } if (myarray) { free(myarray); } myarray = NULL; //垃圾 } void main() { int ret = 0, i = 0; char *p = "abcdef,acccd,eeee,aaaa,e3eeeee,sssss,"; char **buf_err = NULL; char c = ','; char buf[10][30]; int ncount = 10; char **myarray = NULL; //1初始化的是定义指针变量的时候,指针变量赋值成null char ** myarray1 = NULL; char **myarray2 = NULL; char **myarray3 = NULL; myarray1 = spitString_Creat(10); if (myarray1 == NULL) { printf("func spitString_Creat() \n"); goto End; } myarray2 = spitString_Creat(10000); if (myarray2 == NULL) { //2 释放的时候,判断是不是null spitString05_free(myarray1, 10); //myarray1 = NULL; //3 释放完毕以后再赋值成null printf("func spitString_Creat() \n"); goto End; } myarray3 = spitString_Creat(10); if (myarray3 == NULL) { printf("func spitString_Creat() \n"); goto End; } for (i=0; i<ncount; i++) { printf("%s\n", myarray[i]); } End: if (myarray1 != NULL) { spitString05_free(myarray1, 10); myarray1 = NULL; } if (myarray2 != NULL) { spitString05_free(myarray2, 10); myarray2 = NULL; } if (myarray3 != NULL) { spitString05_free(myarray3, 10); myarray3 = NULL; } system("pause"); } |
乐享:知识积累,快乐无限。