文章首发及后续更新:
http://mwhls.top/619.html
新的更新内容请到
mwhls.top
查看。
如果没有图片请到上方的文章首发页面查看。
被整型数组的sizeof误导,我二级指针的空间分配一直出现问题,今天(和今天的明天)终于解决了!
还有如何将字符串数组的传参问题!
我!
墙!
啊!
概念
指针用来指向地址,例如
int *p = #
表示用 int型的p指针 存放 num的地址。
而二级指针,
int *q = &p;
表示用 q 存放 p 的地址。
注意这里的&p,如果写成p,那么只是q依然只是一级指针,将指向num的地址。
此时的等价关系:
p == #
*p == num;
q == &p;
*q == p;
*q == p == #
**q == *p == num;
函数传参
想要将一个二维字符串数组传入函数,那么在定义时,需用格式:
char *strs[] = {"str1", "str2"};
中括号[]内不用写大小,就如同一维数组一样。
对于一个传入二级指针的函数
char *putFirstChar(char **charArray);
在传参时,直接使用变量名作为实参即可,即
putFirstChar(strs);
这样,在函数内部调用时,就可以使用
strs[0][0];
形式了。
我试过使用
char **strs1, strs2[3][3], strs3[3][];
,三种都不行。
长度获取
一维整型数组
int intArray[10] = {1, 2};
,可以使用
int arraySize = sizeof(intArray)/sizeof(int);
来获取,此时的
sizeof(intArray)/sizeof(int) == 10;
,而不等于2.
但一维字符串数组
char charArray[10] = "12";
,需要用
strlen(charArray)
来获取,此时长度为2,而不等于10。
int i = strlen(charArray);
函数的效果和
for(int i=0; charArray[i]!='\0'; i++);
相同(在for内定义变量可能出错,出错请在for外定义i变量)。
一级字符串指针的空间分配
对于
char *charArray;
的空间分配,使用
charArray = (char*)malloc(sizeof(char)*arrayLength);
,其中的arrayLength为整型变量,表示char空间的个数。
重新分配时,使用
charArray = (char*)realloc(charArray, (strlen(charArray)+1+addLength) * sizeof(char));
函数,表示给charArray变量增加addLength长度的空间。
这里的长度用
strlen(charArray)+1
,因为字符串的结束符
'\0'
也占据空间,这里的长度不能用sizeof()来获取,它无法获取char类型数组的大小。
二级字符串指针的空间分配
这里的内存空间分配好可恶,好可恶好可恶!
我有的题分配了空间,一直栈溢出,气死了,我都把倍数调到一百了明明!
但是今天做题突然就正常分配了,好气哇!
使用到这个分配的在后面第三篇,看这里
LeetCode-17-电话号码组合(C)
。
按下面的格式进行内存分配即可,分配完后,char2DArray指针可以当做二维数组来用,即使用char2DArray[0][0]这种方式进行赋值。
char **char2DArray;
int sizeIn1, sizeIn2, i;
char2DArray = (char**)malloc(sizeof(char*) * sizeIn1);
for(i=0; i<sizeIn2; i++){
*(char2DArray + i) = (char*)malloc(sizeof(char) * sizeIn2);
}
此外,这种分配方式是通用的,int型也可以,只要将代码内的char全部替换成int就行了。