C中的数组用于将相关数据存储在具有索引的单个变量名称下,也称为下标。最简单的方法是将数组视为一个列表或对相同类型的变量进行有序分组。因此,数组通常可以帮助程序员有效且直观地组织数据集合。
稍后我们将考虑一个指针的概念,这是C的基础,它扩展了数组的性质(数组可以称为常量指针)。现在,我们将只考虑他们的声明和使用。
数组
C数组以下列形式声明:
类型名称[元素数量];
例如,如果我们想要一个包含六个整数(或整数)的数组,我们用C语言写:
int 数[ 6 ];
对于称为字母的六字符数组,
炭 字母[ 6 ];
等等。
您也可以在声明时进行初始化。只需将逗号分隔的花括号中的初始元素作为初始值:
类型名称[元素数量] = {逗号分隔值}
例如,如果我们想具有六个整数初始化一个数组,0,0,1,0,0,0作为初始值:
INT 点[ 6 ] = { 0 ,0 ,1 ,0 ,0 ,0 };
虽然在这种情况下初始化数组时,可能会省略数组维度,并且数组将自动调整大小以保存初始数据:
INT 点[] = { 0 ,0 ,1 ,0 ,0 ,0 };
这非常有用,因为可以通过简单地从定义中添加或删除初始化元素来控制数组的大小,而无需调整维度。
如果指定了维度,但并未初始化数组中的所有元素,则其余元素将包含值0.这非常有用,尤其是当我们有非常大的数组时。
int numbers [ 2000 ] = { 245 };
上面的示例将数组的第一个值设置为245,其余值设置为0。
如果我们想要访问存储在数组中的变量,例如使用上面的声明,下面的代码将在变量x中存储1
int x ; x = 点[ 2 ];
C中的数组从0开始索引,而不是从1开始。上面数组的第一个元素是point [0]。数组中最后一个值的索引是数组大小减1。在上面的示例中,下标从0到5运行.C不保证对数组访问的边界检查。编译器可能不会抱怨以下内容(尽管最好的编译器会这样做):
char y ; int z = 9 ; 炭 点[ 6 ] = { 1 , 2 , 3 , 4 , 5 , 6 }; //访问数组外部的示例。编译错误并不总是提出 y = point [ 15 ]; y = 点[ - 4 ]; y = 点[ z ];
在程序执行期间,越界数组访问并不总是导致运行时错误。从点[-1]检索值后,您的程序可能会愉快地继续。为了缓解索引问题,在编码处理数组的循环时,通常使用sizeof()表达式。
很多人使用宏来反过来使用sizeof()来查找数组中的元素数量,一个名为 “lengthof()” 的宏,[ “MY_ARRAY_SIZE()”或“NUM_ELEM()”,[“SIZEOF_STATIC_ARRAY()”,[ 等
int ix ; 短 anArray [] = { 3 , 6 , 9 , 12 , 15 }; for (ix = 0 ; ix < (sizeof (anArray )/ sizeof (short )); ++ ix ) { DoSomethingWith (“%d” , anArray [ ix ] ); }
请注意,在上面的示例中,未明确指定数组的大小。由于初始化列表中的五个值,编译器知道将其大小设置为5。向列表中添加其他值将使其大小为6,并且由于for循环中的sizeof表达式,代码会自动调整为此更改。良好的编程习惯是声明一个可变大小,并将数组中的元素数存储在其中。
size = sizeof(anArray)/ sizeof(短)
C还支持多维数组(或者更确切地说,数组数组)。最简单的类型是二维数组。这将创建一个矩形数组 – 每行具有相同的列数。要获得一个包含3行和5列的char数组,我们用C语言编写
char two_d [3] [5];
要访问/修改此数组中的值,我们需要两个下标:
char ch ; ch = two_d [ 2 ] [ 4 ];
要么
two_d [ 0 ] [ 0 ] = 'x' ;
类似地,可以像这样初始化多维数组:
INT two_d [ 2 ] [ 3 ] = {{ 5 , 2 , 1 }, { 6 , 7 , 8 }};
列的数量必须明确说明; 但是,编译器将根据初始化列表找到适当的行数。
还有一些奇怪的符号可能:
int a [ 100 ]; int i = 0 ; if (a [ i ] == i [ a ]) { printf (“Hello world!\ n ” ); }
a [i]和i [a]指的是同一个地点。(这将在下一章中解释。)
字符串
C没有内置的字符串处理设施; 因此,字符串被定义为字符数组。C允许字符数组由字符串而不是字符列表表示,并且空终止字符自动添加到结尾。例如,要存储字符串“Merkkijono”,我们会写
char string [ 11 ] = “Merkkijono” ;
要么
char string [ 11 ] = { 'M' , 'e' , 'r' , 'k' , 'k' , 'i' , 'j' , 'o' , 'n' , 'o' , '\ 0 ' };
在第一个示例中,字符串将具有由编译器自动附加到末尾的空字符; 按照惯例,库函数期望字符串由空字符终止。后一个声明表示单个元素,因此需要手动添加空终止符。
字符串并不总是必须链接到显式变量。正如您已经看到的那样,可以直接创建一个字符串作为直接使用的未命名字符串(与printf函数一样)。
要创建一个超长字符串,您必须将字符串拆分为多个部分,方法是使用引号关闭第一部分,然后在下一行重新开始字符串(也以引号开头和结尾):
char string [ 58 ] = “这是一个非常非常长的” “字符串,需要两行。” ;
虽然字符串也可以通过将反斜杠字符放在行的末尾来跨越多行,但不推荐使用此方法。
有一个有用的字符串处理例程库,您可以通过包含另一个头文件来使用它。
#include <string.h> //新的头文件
此标准字符串库将允许对字符串执行各种任务,并在“ 字符串”一章中进行了讨论。
猜你想读:《C编程.开始C》8.数组和字符串