解惑丨C语言字符串常量字符数组字符指针!

Posted C语言编程俱乐部

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解惑丨C语言字符串常量字符数组字符指针!相关的知识,希望对你有一定的参考价值。

如果你被这几个概念搞的头晕目眩,貌似懂了,但没完全懂。

想通过理解的方式去搞清楚,而不是通过记性来记住。

突然就发现了一句万能钥匙【基础】,能解决大部分跟指针相关的概念问题:

「指针存储的是地址

一、代码

二、字符串常量

定义:用双引号("")括起来的0个或者多个字符组成的序列

存储:每个字符串尾自动加一个 ‘\\0’ 作为字符串结束标志

————————————

字符串常量在内存的常量存储区是按顺序存储的,如:

    ▷ 定义a时,判断存储区是否有"123\\0",存储一个"123\\0";

    ▷ 定义b时,判断存储区是否有"456\\0",发现没有则在后面追加"456\\0";

    ▷ 定义c时,判断存储区是否有"456\\0",发现有,则不再存储,此时b和c两个指针存储的都是"456\\0"这片内存地址【编译器优化】

既然是常量,那么不可被修改,所以memcpy(b, a, 3);是错误的

三、字符数组

char a[] = "123";

首先声明一个字符数组a,大小没有确定,但是将一个字符串常量“123\\0”赋值给了a,故a的length就是4个字节。

注意a归根结底是一个数组,而数组是一个变量,不是指针,虽然可把a当做一个指针,因为它指向数组的首地址,但归根结底不是指针,指针存的是地址,变量存的是指...又晕了

正因为a是变量,所以a能够修改其存储的值。

a[0] = 'a';

四、字符指针

const char* b = "321";

既然名字是字符指针,那么它一定是个指针,根据万能钥匙能够得知,指针存储的地址。

故解读这句就是:

首先声明一个字符指针b,然后定义一个字符串常量"321\\0",字符串常量存储在常量区,b存储在栈区,b的值是字符串常量"321\\0"的地址。

这里用到了const,在C语言里不加const也行,C++里不加会有个警告,但不影响编译。但是建议加上const,能够让程序员一眼就知道此指针指向的是常量,也就是最终内容无法修改。

ps:

const type* p;

虽然最终指向不能修改,但是指针自身的取值,是可以修改的,即可修改指针指向的地方。

五、内存图

ps:所有存储类型代码区、常量区、静态区(全局区)、堆区、栈区,只有栈是从高地址往低地址存储,其他都是低地址往高地址存储。

根据这个,打印一个栈变量地址是0x7******,大概能够猜到此pc的内存条大小为8GB【纯猜测未验证】!

- End -

————————————

不管你是转行也好,初学也罢,进阶也可,如果你想学编程,进阶程序员~

【值得关注】我的 编 程 学 习 交 流 俱 乐 部 !【点击进入】

C语言入门资料(网盘链接免费分享)

C语言推荐书籍(PDF免费分享)

以上是关于解惑丨C语言字符串常量字符数组字符指针!的主要内容,如果未能解决你的问题,请参考以下文章

C 语言数组 ( 指针数组用法 | 菜单选择 )

C 语言字符串 一级指针 内存模型 ( 指定大小字符数组 | 未指定大小字符数组 | 指向常量字符串的指针 | 指向堆内存的指针 )

C 语言内存四区原理 ( 常量区示例 | 不同函数返回的相同字符串的指针地址相同 )

C语言字符串初值对函数说明

C语言字符串常量,字符数组占内存大小问题?

C字符串常量定义