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

  • Post author:
  • Post category:其他


文章首发及后续更新:

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就行了。



版权声明:本文为asd123pwj原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。