C语言二级字符串指针的使用(函数传参/长度获取/空间分配)

被整型数组的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就行了。

You may also like...

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注