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

原创 2016年05月30日 11:26:05

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" 塞入栈中的数组,这是可行的。


相关文章推荐

PYQT5+python3.6+QT编写一个带ui的加密解密小程序<凯撒加密><维吉尼亚加密><仿射加密><培根加密>

许多人在学习如何创建一个 GUI 应用的时候都感到十分的困难。其中最重要的原因是,他们不知道应该从何下手。大多数的教程都只有文字,但事实上仅仅依靠文字很难学会 GUI 编程,因为 GUI 应用大多数都...

qt5.0 以上 环境搭建

qt所有免费版下载地址:http://download.qt.io/archive/qt/ (1)5.*版本安装 下载好后,解压安装,安装途中会让选择安装插件,注意要安装mingw,然后一...

如何优雅地使用c语言编写爬虫

前言 大家在平时或多或少地都会有编写网络爬虫的需求。一般来说,编写爬虫的首选自然非python莫属,除此之外,java等语言也是不错的选择。选择上述语言的原因不仅仅在于它们均有非常不错的网络请求库和...

C语言中一种更优雅的异常处理机制 - setjmp/longjmp

转自:http://blog.chinaunix.net/u/22711/showart_445098.html 实际上goto语句是面向过程与面向结构化程序语言中,进行异常处理编程的最原始的支...

c语言中所有字符串函数使用手册

  • 2010年02月10日 16:21
  • 190KB
  • 下载

C语言 使用递归 逆序输入的字符串,并且返回保存的结果

我们可以使用递归来逆序输入的字符串: #include void reverse(); int main() {     printf("输入:");     reverse();   ...

C语言字符串函数和C++string类中的部分函数的使用

C语言字符串函数1、void *memset(void *dest, int c, size_t count); 将dest前面count个字符置为字符c. 返回dest的值.2、void *me...

C语言:使用链表实现的可变长度字符串处理函数

//unlimitedstr.h struct usrstr { char str; struct usrstr * next; struct usrstr * back; }; str...
  • jinlxz
  • jinlxz
  • 2013年04月13日 11:18
  • 622

c语言字符数组与字符串的使用详解

本篇文章是对c语言中字符数组与字符串的使用进行了详细的分析介绍,需要的朋友参考下 1、字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。 char s...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言(如何优雅地使用字符串)
举报原因:
原因补充:

(最多只允许输入30个字)