一维数组:
1、初始化:char buf[5] = "hello"; 和 char buf1[] = "world";编译器自动计算数组大小。
区别:前者buf[5] = "hello"该方式不是字符串, 而是字符数组, 因为没有\0;char buf1[] = "world"是以\0在后面作为结束。
2、字符串的赋值:
给 char* 类型的字符串赋值,可以直接使用 "=" 号
给 char[] 类型的字符串赋值,需要使用 strcpy 函数
3、 malloc申请使用堆内存的步骤:
int *pbuf=(int *)malloc(sizeof(int *)*5);
memcpy(pbuf,bufint,(sizeof(bufint)));
printf("pbuf=%d\n",pbuf[4]);
void fun1(void)
{
char buf[5] = "hello";
char buf1[] = "world";
printf("buf=%c\n",buf[2]); //l
printf("buf1=%s\n",buf1); //world
int bufint[5] = {1,29,365,4141,50000};
printf("bufint=%d\n",bufint[4]);
//使用malloc来为一维数组申请堆内存的方法
int *pbuf=(int *)malloc(sizeof(int *)*5);
memcpy(pbuf,bufint,(sizeof(bufint)));
printf("pbuf=%d\n",pbuf[4]);
}
/****************************************************************************************************************************************************/
多维数组的初始化方式:
1、bufchar[5][4] = {{"acda"},{"grsa"},{"yrtw"},{"olyh"},{"yevb"}};使用{}
2、char bufchar[5][4] = {"acda","grsa","yrtw","olyh","yevb"};直接赋值
二维数组输出问题:
1、在代码中二维数组bufchar和BUF中间如果没有"\0"结束标志,那么输出结果将会在bufchar输出结束的后面紧跟着输出BUF里面的全部内容。
2、原因:bufchar输出结束并没有结束标志位。数组是临时变量,放在栈上面,他们的内存是紧接着的。
解决办法:
a、可以将unsigned char bufchar[5][4] = {{"acda"},{"grsa"},{"yrtw"},{"olyh"},{"yevb"}};改为unsigned char bufchar[6][4] = {{"acda"},{"grsa"},{"yrtw"},{"olyh"},{"yevb"},{"\0"}};
b、将BUF与bufchar的位置互换
c、在BUF和charbuf中间加上一个unsigned char zero[5][4] = {"\0"};
d、使用malloc分别分配内存。
上面四中办法可以正确输出buf[1]的内容
4、使用堆内存、并初始化
unsigned char (*bufchar)[4]=(unsigned char(*)[4])malloc(sizeof(unsigned char)*5*4); //使用数组指针的办法
初始化不能像平常的二维数组一样,集体使用{}后者""来初始化,编译会报错。
我们采用堆内存申请多维数组后,可以最常用的一个个赋值,或者采用memcpy(&bufchar[0],"acda",4);函数来赋值。这点很重要。因为要操作的是一个指针。
3、可以使用memcpy进行二维数组的重新赋值、改变。
memcpy(&bufchar[2][0],"hhhh",4); 将bufchar[2][0]开始的四个字节改为hhhh。
void fun2(void)
{ //malloc堆内存来操作二维数组
//unsigned char (*bufchar)[4]=(unsigned char(*)[4])malloc(sizeof(unsigned char)*5*4);
//(*bufchar)[4] = {"acda","grsa","yrtw","olyh","yevb"};
//memcpy(&bufchar[0],"acda",4);
//memcpy(&bufchar[1],"grsa",4);
unsigned char bufchar[5][4] = {{"acda"},{"grsa"},{"yrtw"},{"olyh"},{"yevb"}};
unsigned char zero[5][4] = {"\0"};
unsigned char BUF[5][4] = {"ada1","dss1","e5yh","f3ts","ghsd"};
printf("bufchar[0][1]=%c\n",bufchar[0][1]); //c
printf("bufchar[1][2]=%c\n",bufchar[1][2]); //s
printf("bufchar[1]=%s\n",bufchar[1]);
memcpy(&bufchar[2][0],"hhhh",4);
printf("bufchar[1]=%s\n",bufchar[1]);
printf("bufchar[1]=%p\n",&bufchar[1]);
printf("bufchar[1][0]=%p\n",&bufchar[1][0]);
printf("bufchar[1][0]=%p\n",&bufchar[1][1]);
printf("bufchar[1][0]=%p\n",&bufchar[1][2]);
printf("bufchar[1][0]=%p\n",&bufchar[1][3]);
printf("BUF[0][0]=%p\n",&BUF[0][0]);
printf("BUF[1][0]=%p\n",&BUF[0][1]);
printf("BUF[0][1]=%c\n",BUF[0][1]); //d
printf("BUF[1][2]=%c\n",BUF[1][2]); //s
bzero(BUF,5);
memcpy(&BUF[1],"GOOD",1);
printf("BUF[1]=%s\n",BUF[1]);
}
主函数
int main(void)
{
fun1();
fun2();
return 0;
}
执行结果: