*关于C语言字符串数组*
此处我为大家解决一个十分容易混淆的点。此处问题在22备考过程中问的比较多。最可气的是21、22考研场上都考到了。此处为23及以后考生做出详细解释。
首先我们来看2000年的真题,
2、#include<iostream>
using namespace std;
int main()
{
static char t[5]={"abcd", "efgh", "ijkl", "monp", "qrst", "uvwx"};
cout<<t1[3]<<" "
<<*(t1+3)<<" "
<<(((t+1)+2)+3)
<<" "<<((t[1]+2)+3)
<<endl;
cout<<**t<<" "
<<((t+1)+1)<<" "
<<t0<<" "
<<**t+1<<endl;
return 0;
}
这里我们该如何理解呢?
第一步:我们首先应该了解C语言编译器的一个特性,C语言中字符串都会有一个结束标志,即 ‘\0’ ,这个字符在ACSII码表中为第一个,其值为0。空字符,这是字符串中作为结束的判断标记。
此处为举例子:
只考虑字母只有8个,但是由于空字符的存在,所以这里必须是9个长度。
在了解C语言字符串长度的基础上,我们继续解读。
此处我们可以了解到尽管最后加了一个空字符,但是调用函数strlen()函数的时候是不计算在内的。但是最后一个‘\0’是真实存在的。
第二部:当输出函数列入 puts(); printf();cout;等C语言输出函数在输出数据的时候,遇到 ‘\0’ 就会结束输出。笔者关于这里的认识是:当输出的东西是一个指针时,它会输出到该字符串的“\0”;当输出的东西是具体某个元素时(具体指针指向的元素如:ss[1])它会直接输出该字符。
接下来我们看一段代码。
此处可以理解为[]为指向具体元素,而ss+n表示ss指针向后移动n位。
至此字符串数组基本理论叙述完成。
在此基础上我们再看2000年的真题。他扩充到了三维(22年是一个二维问题)。
其中1、关于三维指针t你可以这么理解*t行数[每个字符串长度],*
2、t[],三个括号可以理解为具体的指向某个元素。
3、t+n,为一维指针。而此处的*(t+n)为指针指向的具体元素。
4、t为二维指针指向第一行,(t+1)指向第二行,*(t+1)+1指向第二行第二个字符串。
5、t[1]也相当于指向第二行,和*(t+1)为同一个意思。
6、(t[1]+2)+3不难理解是第二行 第三个字符串 的第四个位置的指针,故(*(t[1]+2)+3)为该位置的元素也就是x。
我为大家展示下思考:
再来看一下21年真题。
22年真题。
这部分用到了代码展示所以排版略显凌乱,话糙理不糙,只要能为大家拿到这5分我想是值得的。** **