C语言->字符指针学习笔记

字符串常量是一个字符数组,例如:

"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的内容没有变化,只是没有指针指向它了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章