前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言(如何优雅地使用字符串)

C语言(如何优雅地使用字符串)

作者头像
用户2617681
发布2019-08-08 10:31:52
8340
发布2019-08-08 10:31:52
举报
文章被收录于专栏:秘籍酷

C语言中使用字符串有两种方式,用char型指针、用char型数组。他们有什么区别和联系? 且听我一一道来。

C语言表示字符串的两种方式,look:

char *s1 = "abcde"; // s1 是指针 char s2[] = "uvxyz"; // s2 是数组

首先,任何常量都将被放置到一个固定的内存区域,叫 .rodata 区,也叫常量区。因此上述代码中的 "abcde" 和 "uvxyz" 都被放置在这里面。

其次,s1 和 s2 都是普通变量,都被放置在栈内存中。

然后,s1 是一个指针,因此它的尺寸大小永远都是四字节(32位系统),而 s2 是一个数组,尺寸大小根据具体的内容来决定。

因此,上述代码中各个变量在内存中的位置关系,用下图来表示:

对于 s1 而言,仅仅保留了一个地址0x123,该地址就是常量区中字符串 "abcde" 的地址。

对于 s2 而言,则保留了从常量区复制过来了字符串本身的内容 "uvxyz" ,从上图看到,此时 "uvxyz“ 实际上有两个副本。

那么在程序中如何使用这两种方式呢?答案很简单,如果仅仅是使用字符串,而不需要修改它,那就使用指针就行了,但是如果涉及需要对字符串内容的修改,那么就需要使用数组。

look:

strcpy(s1, "ABCDE"); // 这是错误的 strcpy(s2, "UVXYZ"); // 这是正确的

上述代码中,第一行试图将 "ABCDE" 塞到常量区,显然是不可行的。而第二行则试图将 "UVXYZ" 塞入栈中的数组,这是可行的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秘籍酷 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档