天天看点

iOS开发系列--C语言之数组和字符串概览一维数组扩展--数组的存储多维数组字符串

数组在c语言中有着特殊的地位,它有很多特性,例如它的存储是连续的,数组的名称就是数组的地址等。而在c语言中是没有string类型的,那么如果要表示一个字符串,就必须使用字符数组。今天主要就介绍如下三个方面:

<a href="http://www.cnblogs.com/kenshincui/p/3843505.html#onedimensionalarray">一维数组</a>

<a href="http://www.cnblogs.com/kenshincui/p/3843505.html#moredimensionalarray">多维数组</a>

<a href="http://www.cnblogs.com/kenshincui/p/3843505.html#string">字符串</a>

一维数组操作比较简单,但是需要注意,数组长度必须是固定的,长度不能使用变量进行初始化;如果声明的同时进行赋值则数组长度可以省略,编译器会自动计算数组长度;同时数组不能先声明再一次性赋值(当然可以对每个元素一一赋值)。

数组在内存中存储在一块连续的空间中,如果知道数组类型(int、float等)和初始地址就可以知道其他元素的地址,同时由于数组名等于数组第一个元素的地址,所以当数组作为参数(作为参数时形参可以省略)其实是引用传递。

我们看一下上面定义的数组在内存中存储结构

iOS开发系列--C语言之数组和字符串概览一维数组扩展--数组的存储多维数组字符串

再来看一下数组作为参数传递的情况,数组作为参数传递的是数组的地址

多维数组其实可以看成是一个特殊的一维数组,只是每个元素又是一个一维数组,下面简单看一下多维数组的初始化和赋值

以上面a数组为例,它在内存中的结构如下图

iOS开发系列--C语言之数组和字符串概览一维数组扩展--数组的存储多维数组字符串

根据上图和一维数组的存储,对于二维数组可以得出如下结论:数组名就是整个二维数组的地址,也等于第一行数组名的地址,还等于第一个元素的地址;第二行数组名等于第二行第一个元素的地址。用表达式表示:

a=a[0]=&amp;a[0][0]

a[1]=&amp;a[1][0]

同样可以得出a[i][j]=a[i]+j。关于三维数组、四维数组等多维数组,其实可以以此类推,在此不再赘述。

在c语言中是没有字符串类型的,如果要表示字符串需要使用char类型的数组,因为字符串本身就是多个字符的组合。但是需要注意的是字符串是一个特殊的数组,在它的结束位置必须要加一个”\0”(ascii中0是空操作符,表示什么也不做)来表示字符串结束,否则编译器是不知道什么时候字符串已经结束的。当直接使用字符串赋值的时候程序会自动加上”\0”作为结束符。

从上面代码注释中可以看到打印b的时候不是直接打印出来“iam”而是打印出了“iamkenshin”,原因就是编译器无法判断字符串是否结束,要解释为什么打印出“iamkenshin”我们需要了解a和b在内存中的存储。

iOS开发系列--C语言之数组和字符串概览一维数组扩展--数组的存储多维数组字符串

从图中我们不难发现由于a占用8个字节,而定义完a后直接定义了b,此时分配的空间连续,b占用3个字节,这样当输出b的时候由于输出完“iam”之后并未遇到”\0”标记,程序继续输出直到遇到数组a中的“\0”才结束,因此输出内容为“iamkenshin”。

下面简单看一下和字符和字符串相关的常用的几个函数

注意: 1.在xcode中会提示gets是不安全的,推荐使用fgets()。 2.strlen()只用于计算字符串长度,由于在c语言中字符串使用字符数组长度表示,所以它可以计算带有’\0’结尾的字符数组长度,但是它并不能计算其他类型的数组长度。

继续阅读