首页 php教程 PHP开发 C语言中字符串和数组的区别

C语言中字符串和数组的区别

Dec 12, 2016 pm 05:25 PM
字符串数组

数组的元素可以是任意一种类型,而字符串是一种特殊的数组,它使用了一种众所周知的确定其长度的规则。

有两种类型的语言,一种简单地将字符串看作是一个字符数组,另一种将字符串看作是一种特殊的类型。C属于前一种,但有一点补充,即C字符串是以一个NUL字符结束的。数组的值和数组中第一个元素的地址(或指向该元素的指针)是相同的,因此通常一个C字符串和一个字符指针是等价的。

一个数组的长度可以是任意的。当数组名用作函数的参数时,函数无法通过数组名本身知道数组的大小,因此必须引入某种规则。对字符串来说,这种规则就是字符串的最后一个字符是ASCII字符NUL('\0')。

在C中,int类型值的字面值可以是42这样的值,字符的字面值可以是‘*’这样的值,浮点型值的字面值可以是4.2el这样的单精度值或双精度值。

注意:实际上,一个char类型字面值是一个int类型字面值的另一种表示方式,只不过使用了一种有趣的句法,例如当42和'*'都表示char类型的值时,它们是两个完全相同的值。然而,在C++中情况有所不同,C++有真正的char类型字面值和char类型函数参数,并且通常会更仔细地区分char类型和int类型,整数数组和字符数组没有字面值。然而,如果没有字符串字面值,程序编写起来就会很困难,因此C提供了字符串字面值。需要注意的是,按照惯例C字符串总是以NUL字符结束,因此C字符串的字面值也以NUL字符结束,例如,“six times nine”的长度是15个字符(包括NUL终止符),而不是你看得见的14个字符。

关于字符串字面值还有一条鲜为人知但非常有用的规则,如果程序中有两条紧挨着的字符串字面值,编译程序会将它们当作一条长的字符串字面值来对待,并且只使用一个NUL终止符。也就是说,“Hello,”world”和“Hello,world”是相同的,而以下这段代码中的几条字符串字面值也可以任意分割组合:
    char    message[]=
    ”This is an extremely long prompt\n”
    ”How long is it?\n”
    ”It's so long,\n”
    ”It wouldn't fit On one line\n”;
在定义一个字符串变量时,你需要有一个足以容纳该字符串的数组或者指针,并且要保证为NUL终止符留出空间,例如,以下这段代码中就有一个问题:
    char greeting[12];
    strcpy(greeting,”Hello,world”);  /*trouble*/

在上例中,greeting只有容纳12个字符的空间,而“Hello,world”的长度为13个字符(包括NUL终止符),因此NUL字符会被拷贝到greeting以外的某个位置,这可能会毁掉greetlng附近内存空间中的某些数据。再请看下例:
    char  greeting[12]=”Hello,world”;/*notastring*/

上例是没有问题的,但此时greeting是一个字符数组,而不是一个字符串。因为上例没有为NUL终止符留出空间,所以greeting不包含NUL字符。更好一些的方法是这样写:
    char  greeting[]=”Hello,world”;
这样编译程序就会计算出需要多少空间来容纳所有内容,包括NUL字符。

字符串字面值是字符(char类型)数组,而不是字符常量(const char类型)数组。尽管ANSIC委员会可以将字符串字面值重新定义为字符常量数组,但这会使已有的数百万行代码突然无法通过编译,从而引起巨大的混乱。如果你试图修改字符串字面值中的内容,编译程序是

不会阻止你的,但你不应该这样做。编译程序可能会选择禁止修改的内存区域来存放字符串字面值,例如ROM或者由内存映射寄存器禁止写操作的内存区域。但是,即使字符串字面值被存放在允许修改的内存区域中,编译程序还可能会使它们被共享。例如,如果你写了以下代码(并且字符串字面值是允许修改的):
    char    *p="message";
    char    *q="message";
    p[4]='\0'; /* p now points to”mess”*/
编译程序就会作出两种可能的反应,一种是为p和q创建两个独立的字符串,在这种情况下,q仍然是“message”;一种是只创建一个字符串(p和q都指向它),在这种情况下,q将变成“mess”。

注意:有人称这种现象为“C的幽默”,正是因为这种幽默,绝大多数C程序员才会整天被自己编写的程序所困扰,难得忙里偷闲一次。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

oracle中split()函数用法 oracle中split()函数用法 May 07, 2024 pm 01:06 PM

SPLIT() 函数通过指定的分隔符拆分字符串为数组,返回一个字符串数组,其中每个元素都是原始字符串中以分隔符分隔的部分。用法包括:将逗号分隔的值列表拆分为数组、从路径中提取文件名、将电子邮件地址拆分为用户名和域。

java怎么对字符串排序 java怎么对字符串排序 Apr 02, 2024 am 02:18 AM

Java 中对字符串排序的方法:使用 Arrays.sort() 方法对字符串数组按升序排序。使用 Collections.sort() 方法对字符串列表按升序排序。使用 Comparator 接口对字符串进行自定义排序。

\0在c语言中是什么意思 \0在c语言中是什么意思 Apr 27, 2024 pm 10:54 PM

C 语言中,\0 是字符串的结束标志,称为空字符或终止符。由于字符串在内存中以字节数组形式存储,编译器通过 \0 识别字符串结束,确保正确处理字符串。\0 工作原理:编译器遇到 \0 时停止读取字符,之后的字符被忽略。\0 自身不占存储空间。好处包括可靠的字符串处理、提高效率(无需扫描整个数组查找结束)以及方便比较和操作。

args在java中是什么意思 args在java中是什么意思 Apr 25, 2024 pm 10:15 PM

args 在 Java 中表示命令行参数,是一个字符串数组,包含程序启动时传递给它的参数列表。它仅在 main 方法中可用,其默认值为一个空数组,通过索引可以访问每个参数。args 用于接收和处理命令行参数,从而在程序启动时进行配置或提供输入数据。

java中的args是什么意思 java中的args是什么意思 May 07, 2024 am 02:24 AM

args 是 Java 中 main 方法的特殊参数数组,用于获取命令行参数或外部输入的字符串数组。通过访问 args 数组,程序可以读取这些参数,并根据需要进行处理。

PHP 函数中人工智能技术的应用 PHP 函数中人工智能技术的应用 May 01, 2024 pm 01:15 PM

AI技术已与PHP函数相结合,增强了应用程序的功能。具体的AI应用包括:使用机器学习算法对文本进行分类,如朴素贝叶斯。使用自然语言处理技术进行深入文本分析,如分词和词干提取。

在C语言环境下如何对中文字符进行排序? 在C语言环境下如何对中文字符进行排序? Feb 18, 2024 pm 02:10 PM

如何在C语言编程软件中实现中文字符排序功能?在现代社会,中文字符排序功能在很多软件中都是必不可少的功能之一。无论是在文字处理软件、搜索引擎还是数据库系统中,都需要对中文字符进行排序,以便更好地展示和处理中文文本数据。而在C语言编程中,如何实现中文字符排序功能呢?下面将简要介绍一种方法。首先,为了在C语言中实现中文字符排序功能,我们需要使用到字符串比较函数。然

C++ 函数对程序性能有哪些影响? C++ 函数对程序性能有哪些影响? Apr 12, 2024 am 09:39 AM

函数对C++程序性能的影响包括函数调用开销、局部变量和对象分配开销:函数调用开销:包括堆栈帧分配、参数传递和控制权转移,对小函数影响显着。局部变量和对象分配开销:大量局部变量或对象创建和销毁会导致堆栈溢出和性能下降。

See all articles