字符串是程序设计中一个重要的数据结构(在经典的数据结构教材中,字符串是作为一章来独立讲解的,从这里也能看出字符串是程序设计中的一个重要的数据结构),然而C语言中竟然没有专门的字符串变量。C中如何来处理这种重要的数据结构呢?

在C程序中,可以用两种方法实现一个字符串的存储和运算:字符数组和字符指针。1.符串的表现形式

在C程序中,可以用两种方法实现一个字符串。

1.用字符数组实现。

void

main(void)

{

static char string

[ ] = "I Love China!";

printf("%s\n",string);

}

运行时输出:I Love

China!

和前面介绍的数组属性一样,string是数组名,它代表字符数组的首地址,(见图1)。string[4]代表数组中序号为4的元素(v),实际上string[4]就是*(string+4),string+4是指向字符“v”指针。

图1

2.用字符指针实现。

可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。

void

main(void)

{

char *string = "I

Love China!";

printf("%s\n",string);

}

在这里没有定义字符数组,但C语言对字符串常量是按字符数组处理的,实际上在内存开辟了一个字符数组用来存放字符串数组。在程序中定义了一个字符指针变量string。并把字符串首地址(即存放字符串的字符数组的首地址)赋给它(见图2)。

图2

有人认为string是一个字符串变量,以为定义时把"I Love

China!"赋给该字符串变量,这是不确切的。定义string的部分:

char *string =

"I Love China!";

等价于下面两行:

char

*string;

string = "I

Love China!";

可以看到:string被定义为一个指针变量,它指向字符型数据,请注意只能指向一个字符变量或其它字符类型数据,不能同时指向多个字符数据,更不是把"I Love

China!"这些字符存放到string中。只是把"I Love

China!"的首地址赋给指针变量string(不是把字符串赋给*string)。因此不要认为上述定义行等价于:

char

*string;

*string = "I Love

China!";

在输出时,用

printf("%s\n",string);

%s表示输出一个字符串,给出字符指针变量名string,则系统先输出它所指向的一个字符数据,然后自动使string加1,使之指向下一个字符,然后再输出一个字符,……,如此直到遇到字符串结束标志‘\0’为止(‘\0’的ASCII码为0,ASCII码为0的字符是“空操作字符”,即它不引起任何控制操作,也不是一个可显示的字符)。注意,在内存中,字符串的最后被自动加了一个‘\0’(如图8.18所示),因此在输出时能确定字符串的终止位置。

通过字符数组名或字符指针变量可以输出一个字符串。而对一个数值型数组,是不能企图用数组名输出它的全部元素的。如:

int

i[10];

printf("%d\n",i);

是不行的,只能逐个元素输出。显然,可以把字符串看作为一个整体来处理,可以对一个字符串进行整体的输入输出。

2.字符串指针作函数参数

将一个字符串从一个函数传递到另一个函数,可以用地址传递的办法,即用字符数组名作参数或用指向字符串的指针作参数。在被调用的函数中可以改变字符串的内容,在主调函数中可以得到改变了的字符串。

3.字符指针变量与字符数组

虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点:

(1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串的首地址),决不是将字符串放到字符指针变量中。

(2)赋初值的方式。对数组赋初值要用static存储类别,如

static str[ ]={

"I love China! ");

而对字符指针变量不必加static存储类型,如

char *a = "I

love China! ";

这是因为并没有对数组初始化,只是对指针变量初始化。

(3)赋值方式。对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值。

char

str[14];

str = "I love

China! ";//错误

而对字符指针变量,可以采用下面方法赋值:

char

*a;

a = "I love

China! ";

但注意赋给a的不是字符,而是字符串的首地址。

c语言中字符串的加法运算,C语言中字符串的存储和运算相关推荐

  1. c语言 大数开方,大数加法之C语言函数法(只有正数版)

    由于某些原因,我于今天2017-4-19将我的博文搬到博客园了,以后我就在这里扎根了. 之前想过在博客写文章方便日后复习,但一直未能实现,所以,现在这篇是我个人人生中第一篇博客,所以写博客完全没经验, ...

  2. 为什么单独循环中的元素加法比组合循环中的要快得多?

    假设<code>a1 , b1 , c1和d1指向堆内存,而我的数字代码具有以下核心循环. const int n = 100000;for (int j = 0; j < n; j ...

  3. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  4. shell 做加法运算_C语言探索之旅 | 第一部分第七课:运算那点事

    上一课是 C语言探索之旅 | 第一部分第六课:变量的世界(三),显示变量内容 今天,我们一起来学习 C语言(对大多数编程语言也类似)中的运算. 之前的课中,我们已经说过:电脑是一台"笨笨&q ...

  5. c语言中左移和乘法谁高级,C程序员说使用移位运算代替乘法和除法更有效,是真的吗?...

    在C语言程序开发中,某些移位操作似乎达到与乘法和除法运算相同的效果. 例如,4 >> 1等于2,向右移一位等于2除. 类似地,2 << 1等于4,向左移一位等于2. 因此,一些 ...

  6. c语言中除法怎么取模,c语言如何取模运算

    满意答案 hqshi888 2017.08.27 采纳率:45%    等级:13 已帮助:12014人 C语言用取模运算符"%"进行取模运算. 取模运算符"%" ...

  7. c语言中取字符串的首元素,C语言字符串

    @[toc] 在很多教程中,字符串不过是一个以0结束的字符数组,但是,在我看来,字符串虽然不是C语言基本数据类型,但它比任何数据类型都重要,因为字符串是最常用的数据. 一.字符串的概念 我们可以把字符 ...

  8. C语言中字符串赋值处理方式,C语言中字符串赋值处理方式

    C语言中,字符串可以赋值给字符指针变量,或者将字符串用字符数组保存.因为c语言没有直接对字符串提供语法糖方面的支持.而且C标准库很多方法处理字符串是以空字符结尾为前提的,这个必须要记住. char * ...

  9. c语言 字符串 strncpy,详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用 strcpy 和strcnpy函数--字符串复制函数. 1.strcpy函数 函数原型:char *strcpy(char *dst,cha ...

最新文章

  1. [转]产品需求文档(PRD)的写作
  2. Android App定位和规避内存泄露方法研究
  3. 新书预告《网络规划设计师考试考点分析与真题详解》
  4. es6 --- 数组的扩展
  5. box-sizing -- 盒模型
  6. 32张感恩海报!武汉市文化和旅游局这波操作太可以了
  7. php如何将mysql数据库中的admin字段赋值给session_转php中使用session_set_save_handler()函数把session保存到MySQL数据库实例...
  8. 嵌入式Linux系统编程学习之三十线程的同步
  9. no such file or directory : 'users/shikx/xxx/xxx/Appirater.m'
  10. Java 正则表达式处理复杂文本,效率就是高!
  11. PCL 显示一只小白兔和Eigen矩阵
  12. 脚本录制软件python 按键精灵 tc_GitHub - yang-dongxu/KeymouseGo: 类似按键精灵的鼠标键盘录制和自动化操作...
  13. CMS内容管理系统可行性分析
  14. 【冈凡记录】阿冈与叶凡超女8进6决赛的全观察!
  15. 用html写一个计时器
  16. Spring Boot概述与入门特点配置方式注入方式yim配置文件与多文件配置Spring Boot自动配置原理lombok应用
  17. 怎么自测植物神经紊乱
  18. 小白的模拟电路初步学习20日打卡(18)
  19. Unity UGUI Button 中文详解-Chinar
  20. 精美中文简历LaTex模板集锦

热门文章

  1. 数据可视化:世界银行数据(1960-2017)
  2. UG NX 12 设置旋转参考
  3. c语言xml解析器libxm2
  4. 桌面云之VDC资源发布步骤
  5. 【Java版oj】day33剪花布条、客似云来
  6. ML之FE:机器学习算法/数据挖掘中特征选取(变量筛选)的简介、常用方法(单变量分析并筛选—Filter/Wrapper/Embedded、多变量间相关性分析并筛选—PCC/MIC/IV)之详细攻略
  7. 怎么样区分单播、组播、广播和任意播?
  8. WIZnet——W5100S震撼来袭!
  9. android方框验证码,Android自定义方框EditText注册验证码
  10. CISP注册信息安全专业人员简介