字符串常量是一个字符数组,例如:
"abc123abc"
在字符串的内部表示中,字符数组以空字符'\0'结尾,所以
1.程序可以通过检查空字符找到字符数组的结尾;
2.字符串常量占据的存储单元数也因此比双引号内的字符数大1;
3.当类似于这样一个字符串出现在程序中时,实际上是通过字符指针访问
该字符串的,也就是说,字符常量可通过一个指向其第一个元素的指针来访问。
我们写一段代码:
#include <stdio.h>
int main() {
char *p="abc123abc";
char q[]="abc123abc";
char r[3]="abc";
char s[4]="abc";
printf(p);
printf("abc\n");
return 0;
}
我们看第一句:char *p="abc123abc";
这个语句,将把一个指向该字符数组的指针复制给p。该过程没有进行字符串的复制:
1.而只是涉及到指针的操作;
2.C语言没有提供将整个字符串作为一个整体处理的运算符。
在调试过程中,我们看一下内存:
我们看一下p的运行内存
借鉴右侧的内容,我们看一下左侧的数字(16进制)
我们可以看到,abc123abc 在内存中的表示为 61 62 63 31 32 33 61 62 63 00
其中00代表结束,即'\0';
我们把这几个十六进制转换成ascii看看内容是啥
61->01100001(2进制)->97(10进制)->a的ascii码
62->01100010(2进制)->98(10进制)->b的ascii码
63->01100011(2进制)->99(10进制)->c的ascii码
31->00110001(2进制)->49(10进制)->1的ascii码
32->00110010(2进制)->50(10进制)->2的ascii码
33->00110011(2进制)->51(10进制)->3的ascii码
我们再看一下:char s[4]="abc";
q是一个足以存放初始化字符串及空字符'\0'的一位数组,我们看一下内存:
数组中的单个字符可以进行修改,但是q始终指向同一个存储位置
比如说,我可以这样写q[2]='a';
我们可以看出,单个字符可以进行修改,但是q始终指向同一个存储位置
如果我们故意将数组长度设置的不足存放末尾的'\0',会有啥现象?
r的值后面多了9c和0f 为啥?因为0f后面有'\0'
如果将其输出 结果是abc\234
仔细看看?
9C (16进制)->10011100(2进制)->92(10进制)->'\'的asci码
0F (16进制)->00001111(2进制)-》15(10进制)???
这个234不知道从何处得来
p是一个指针,它可以被修改以指向其它地址,如果试图修改字符串的内容,结果无意义。
比如说:
char *p="abc123abc";
int x=10;
p="ABC";
在执行到x=10这句话的时候,我们看一下p
内存地址是100000F98
当执行完p="ABC";之后
指针P指向的地址发生了变化,指向了10000F94,而不是10000F98的内容变了
那么 10000F98的怎么样了?
我们看看
因为一个如“41”这种16进制数占一个字节,那么四个字节之后呢?
10000F98内容是 61 即a
结合右侧的内容我们也发现,之前p指向的地址10000F98的内容没有变化,只是没有指针指向它了。