二级指针数组(传智-王保明)
二级指针内存模型图
![]()
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");
} |
乐享:知识积累,快乐无限。