首先看下C中的字符串是怎么定义的
参考链接(https://m.runoob.com/cprogramming/c-strings.html?ivk_sa=1024320u)
在 C 语言中,字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。
字符串(character string)就是一个或多个字符的序列。 C没有专门定义字符串的变量类型,而是把它存储在char数组中。存储字符串的数组的最后一个元素是\0,这个字符是空字符(null character),用来标记字符串的结束。空字符不是数字0,它是非打印字符,它的ASCⅡ码值为0。
使用 printf() 与 %c 格式化输出单个字符。
下面的声明和初始化创建了一个 RUNOOB 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 RUNOOB 的字符数多一个。
char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
依据数组初始化规则,您可以把上面的语句写成以下语句:
char site[] = "RUNOOB";
以下是 C/C++ 中定义的字符串的内存表示:
然后再看如何给字符数组赋值
分两种情况,单字符赋值和字符串赋值。
单字符赋值,可通过数组下标方式或指针方式,引用数组元素,进行赋值,如:
char a[10];
char ch='a';
for( i=0;i<10;i++ )
a[i]=ch+i ; //可通过数组下标引用数组元素,完成赋值
char *p;
for( p=a; p<a+10; p++ )
*p=ch++; //通过指针对数组相应元素赋值
字符串赋值,可使用string.h头文件中的字符串操作函数进行赋值,如:
char a[10];
strcpy( a, "abcdefgh");
sprintf(a, "%s", "abcdefgh");
注意:数组在定义时,可以同时进行初始化,但定义完成后,就不能按初始化的形式对其赋值了,如:
char a[10]="abcdefgh"; //这样可以
a="abcdefgh"; //这样是错误的!a是数组名,是一个静态数据:数组首地址值,可以看作是个常数,不能再被改变。
总结:
经过我的实践,发现如果定义字符数组的时候,如果把字符数组的所有位都填上字符,那么,当输出这块字符串的时候,它会识别该次的字符一直到该处地址为null的时候才停。
所以使用字符数组时就需要特别注意最后这串字符串的null的位置。
举例:
char str1[] = "ops"; //(str1+3)这个地址就是null即\0
char str2[3] = {'s', 'k'}; //(str2+2)这个地址就是null即\0
当定义了一个字符数组char str[n],实际可用的字符串长度是(n-1)个字符。
另外一个就是有关字符串和指针的关系,
/*
* Pointer : int string
*/
int test_pointer(void) {
int a =1;
char b ='y';
char str[] = "test";
char* Pn;
Pn = str;
// Pn<=>str<=>&str[0]
printf("取地址(指针) = %d \n", Pn);
printf("数值 = %d \n", Pn);
printf("字符 = %c \n", *(Pn+1));
printf("字符串 = %s \n\n", Pn+1);
return SUCCESS;
}
输出
取地址(指针) = 6421979
数值 = 6421979
字符 = e
字符串 = est
所以Pn<=>str<=>&str[0]。