更新时间:2020-11-05 17:44:34 来源:极悦 浏览1158次
字符串数组其实算是指针数组的一类,其本身有着数组的特征,但在某些方面也和一般的数组有着区别,本文我们就来探究字符串数组的奥秘。
char* str1内存放的是字符串的指针,指向了一个地址而char str2则是在栈中开辟了50char大小的空间来存放这些字符下面的程序通过初始方式来帮助你理解两者的不同:
int main() {
char Str1[10] = "Hello";
char Str2[10];
char Str3[10];
char Str4[10];
char Str5[10] = "World";
char* str1[5] = {Str1, Str2, Str3, Str4, Str5};
char str2[5][10] = {
"Hello",//注意写逗号
"",
"",
"",
"World"};
str1[1] = " Goodbye";
//str2[1] = " Goodbye";//报错:表达式必须是可修改的左值
scanf("%s", str2[1]);
printf("%s", str1[0]);
printf("%s\n", str1[4]);
printf("%s ", str2[0]);
printf("%s\n", str2[4]);
return 0;
}
字符串数组的一个应用写一个程序。输入一个数代表月份,输出这个月的英语单词。我们可以用 if else 来做也可以用 switch 来做。但是今天学习了字符串数组,我们有了更简单的方式来完成。请看下面的程序:int main() {
char* str[12] = { "January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "Decenmber",
};
int month = 0;
while (1) {
printf("input a month\n");
scanf("%d", &month);
if (month >= 1 && month <= 12)
printf("%s\n", str[month - 1]);
else
printf("invalid input\n");
}
return 0;
}
这样写代码被大大缩短了。
我们知道定义一个数组时需要为其指定相应的变量类型。也就是说,定义了数组的类型之后这个数组中的所有变量就都是相同的类型。现在我们就来定义一个字符弄型的数组,如下:char hello[5] = {'H','e','l','l','o'};
这样我们就定义了一个字符型的数组,对于数组型的变量这样定义是没有问题的,但有两个方面的不足:
1. 定义的过程比较麻烦,在数组变量初始化时需要逐个写出每一个字符,并在这每一个字符的两端加上一对单引号。
2. 在显示字符数组时,我们通常希望能够让其一次性的显示出来,而不是通过循环数组的方式逐个显示这些字符。
例如上面定义的数组我们想要用printf将其显示出来我们则需要通过循环的方式:
char hello[5] = {'H','e','l','l','o'};
for (int i = 0; i < 5; i++)
{
printf("%c", hello[i]);
}
Hello
其实,在C语言中支持直接定义字符串的方式来为定义字符数组,例如:
char hello[6] = "Hello";
printf("%s", hello);
Hello
注意,我们在定义这个数组时,指定数组的大小为6,也就是说需要申请6个字节的存储空间,而在等号右侧的双引号中我们却只书写了5个字符。这并不是笔误,C语言规定当使用双引号定义字符串时以'\0'作为这个字符串的结束标志符,也就是说这个字符串一共有6个字符,分别是'H'、'e'、'l'、'l'、'o'、'\0'。关于\0读者只需要知道这是一个特殊的字符即可,它表示字符串的结束,它的值为0。这样我们就可以通过printf函数将这个字符串直接打印出来。需要注意的是,当使用printf来显示字符串时,我们要确保这个字符串变量中最后一个结束字符为\0,如果结束字符不是\0则printf在显示这个字符串时,就不知道显示到何处结束,例如char hello[5] = "Hello";
printf("%s", hello);
Hello#@($0948#."
也就是说,我们虽然定义了一个字符串,但只定义了5个字符的长度,而使用双引号为其初始化时,这个字符串的实际大小应该是6因为要追加一个\0,但我们在定义数组大小时只指定其大小是5所以这个数组中的中只有5个元素分别是'H'、'e'、'l'、'l'、'o'。而在'o'之后并没有'\0',所以在printf显示这个字符串时,显示 Hello之后,并不知道何时结束,所以就会继续显示,直到遇到一个'\0'为止,于是我们程序就出现了非预期的结果。这样的程序并不是我们提倡的,我们在定义字符串时一定要为其多分配一个字符的长度,以便存放字符串的结束符'\0'。当然,使用双引号定义的字符串可以像使用普通数组一样使用其数组元素例如ABC运行结果可以看到直接显示字符串和循环显示字符数组中的元素的效果是一样的。char str[6] = "Hello";
printf("%s\n", str);
for (int i = 0; i < sizeof(str); i++)
{
printf("%c", str[i]);
}
printf("\n");
Hello
Hello
在这里我们使用了另一个重要函数sizeof(),它的作用是可以计算出某一个变量或类型的大小,就是占用的内存字节数,例如:
char ch;
short sh;
int i;
printf("%d %d %d %d %d\n",
sizeof(ch),
sizeof(sh),
sizeof(i),
sizeof(long),
sizeof(long long));
1 2 4 8 8
请注意,long类型的变量在不同的操作系统下占用字节数可能不同,请参数参见《变量大小》。另外在使用sizeof来计算数组大小时,计算的是数组一共占用内存的字节数,而不是数组的元素元素的个数,例如:
int array[4];
printf("%d\n", sizeof(array));
上面例子的结果是16而不是4。
关于字符串数组的知识就介绍到这里,总的来说我们想要掌握字符串数组不仅要学好字符串,同时也要精通数组的相关知识,这些都可以在本站的Java基础教程中学习,只有肯下功夫,钻研透教程中的重点内容,一定能够打好Java基础。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习