数组在所有的语言中,以C最为简单,就是一起始地址,外加一数组的长度,而且基本上没有任何功能可言。然而,在所有的数组使用中,却是C的这种简单的数组形式,以其灵活性和效率,让人惊叹。
C数组从逻辑上讲,是分形一致的(想不到其他词来形容了),分形的意思,就是部分与整体保持一致的构造形式,也即是数组的任何一部分也都是数组,比如一整型数组{1,2,3,4,5},连续取出其中任一连续的部分,都可以看成是一个数组,{2,3}是数组,{1,2,3}是数组,{4,5}也都是数组,差别只在于数组的起始地址和元素的个数。那怕是数组中的任何一个元素,都可以看成是一个长度为1的数组。因此,C数组的这种统一的格式,在作为参数,传递给函数的时候,特别是递归函数中,很是方便。
一些基础知识
先来看看一些基础的东西。
数组可以用一个列值来初始化,例如:
int arr[] = {1,2,3,4}; char arr[] = {'a','b','c',0};
简单的一个整数数组初始化例子:
#include "stdio.h" int main() { /* author: www.nowamagic.net */ int i, length; int arr[] = {1,2,3,4}; length = sizeof(arr) / sizeof(int); printf("sizeof(arr)为:%d\n", sizeof(arr)); printf("sizeof(int)为:%d\n", sizeof(int)); printf("数组长度为:%d\n", length); for(i = 0; i < length; i++) { printf("%d\n", arr[i]); } return 0; }
程序运行结果:
sizeof(arr)为:16 sizeof(int)为:4 数组长度为:4 1 2 3 4
简单的一个char数组初始化例子:
#include "stdio.h" int main() { /* author: www.nowamagic.net */ int i, length; char arr[] = {'a','b','c',0}; length = sizeof(arr) / sizeof(char); printf("sizeof(arr)为:%d\n", sizeof(arr)); printf("sizeof(char)为:%d\n", sizeof(char)); printf("数组长度为:%d\n", length); for(i = 0; i < length; i++) { printf("%c\n", arr[i]); } return 0; }
程序运行结果:
sizeof(arr)为:4 sizeof(char)为:1 数组长度为:4 a b c
假设给一二维数组初始化,将数组的每个元素都初始化为0
方法有两种:
1)使用循环逐个的把数组的元素赋值为0;
2)使用内存操作函数memset将数组所占的内存内容设置为0;
测试代码如下:
#include <stdio.h> #include <stdlib.h> #include <mpi.h> #include <string.h> #define K 15 #define DIM 10 #define LOOP 1000000 int main(int argc, char** argv) { double o_centers[K*DIM]; int i = 0, j = 0, k = 0; MPI_Init(&argc, &argv); printf("Start to test array assign...\n"); double starttime1 = MPI_Wtime(); for(k = 0; k < LOOP; k++) for(i = 0; i < K; i++) for(j = 0; j < DIM; j++) o_centers[j + i*DIM] = 0; double endtime1 = MPI_Wtime(); printf("Array assign takes %5.12f seconds...\n", endtime1 - starttime1); printf("Start to test memset assign...\n"); double starttime2 = MPI_Wtime(); for(k = 0; k < LOOP; k++) memset(o_centers, 0, K*DIM*sizeof(double)); double endtime2 = MPI_Wtime(); printf("Memset assign takes %5.12f seconds...\n", endtime2 - starttime2); MPI_Finalize(); return 0; }
编译运行后,得到结果:
Start to test array assign... Array assign takes 0.624787092209 seconds... Start to test memset assign... Memset assign takes 0.052299976349 seconds...
补充说明
如果数组定义的时候没有指定其大小,并且初始化采用了列表初始化,那么数组的大小由初始化时列表元素个数决定。所以上面例子中的数组分别为 int[4] 和char[4]类型。如果明确指定了数组大小,当在初始化时指定的元素个数超过这个大小就会产生错误。
如果初始化时指定的的元素个数比数组大小少,剩下的元素都回被初始化为0。例如:
int arr[8]={1,2,3,4};
等价于
int arr[8]={1,2,3,4,0,0,0,0};
字符数组可以方便地采用字符串直接初始化。
C的字符串,也很简单,它也是一个数组,只不过最后一个元素是'\nul',加了这么一点限制之后,字符串自然就失去了数组的分形强悍,但C的字符串依然不可小看,因为字符串中,只要带上了'\nul',都能看成是字符串,好比,”hello”这条字符串,只要改变起始地址,就可轻而易举地得到”ello”,”llo”,”lo”,”o”这好几条子字符串,这个特点,可以简化很多字符串操作,并且效率最高。此外,C字符串,只要你愿意,完成可以拿来当成是字符数组来使用,这样,就又恢复了数组分形功能,C函数库中和WINDOWS API,有很多函数就是专门处理C字符数组的。
C的很多东西,就是这样,因为简单,所以强大得另人惊叹。函数、结构体、数组、GOTO、枚举这些简单的东西,巧妙的配合使用,可以玩出很多很多意想不到的神奇功能出来,令人击节赞叹,而且不会像C++那样,存在着所谓的什么心智负担。此外,C中的宏,嘿嘿,俺就不提了,变化多端,鬼神莫测。对于C,我越来越敬畏,它远远不似表面上看的那么简单,其背后自然潜藏着一套精神规则。即使看到每一行C代码,内心都能知道它的相应的汇编代码,那又怎么样,它总是有办法让你惊喜不已。
C CodeBase 计划:对于编程问题,消灭一点,舒服一点;消灭很多,舒服很多;彻底消灭,彻底舒服。
本文向大家介绍C语言数组入门之数组的声明与二维数组的模拟,包括了C语言数组入门之数组的声明与二维数组的模拟的使用技巧和注意事项,需要的朋友参考一下 语言中指针与数组这两个概念之间的联系是密不可分的,以至于如果不能理解一个概念,就无法彻底理解另一个概念。 C语言中的数组值得注意的地方有以下两点: C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来。然而,C语言中数组的元素可以是任
本文向大家介绍C++ 数组初始化,包括了C++ 数组初始化的使用技巧和注意事项,需要的朋友参考一下 示例 数组只是特定类型变量的顺序存储位置的块。数组的分配方式与普通变量相同,但是在其名称后附加方括号,方括号[]中包含适合数组内存的元素数。 下面的数组示例使用typ int,变量名arrayOfInts和[5]数组可以容纳的元素数: 可以像这样同时声明和初始化数组 通过列出其所有成员来初始化数组时
在C语言中,如果像这样初始化数组: 然后,数组中所有未显式初始化的元素将隐式初始化为零。 但是,如果我像这样初始化数组: 输出: 我不明白,为什么打印而不是?这是未定义的行为吗? 注:这个问题是在一次采访中提出的。
主要内容:对数组的总结,关于查找和排序数组(Array)是一系列相同类型的数据的集合,可以是一维的、二维的、多维的;最常用的是一维数组和 二维数组,多维数组较少用到。 对数组的总结 1) 数组的定义格式为: type 为数据类型,arrayName 为数组名,length 为数组长度。 需要注意的是: 数组长度 length 最好是常量表达式,例如 10、20*4 等,这样在所有编译器下都能运行通过;如果 length 中包含了变量,
数组是一种内存分配的形式,数组是定义了一个连续的空间,与指针类似。 数组定义方式 类型 数组名[数组大小];//类型为每个空间的大小,我们通过数组名和下标访问数据,数组名指向存储数据的首地址,但是我们不可以改变数组名指向的地址。数组大小只有在定义的时候生效,定义之后不可以被改变。 int a[100]; //申请了一个名叫a的数组,它包含了100个整型。 数组的访问 我们可以通过数组的下标访问数
问题内容: 在查看源文件时,我看到了两种数组初始化方式。我想知道两者之间是否有区别 和 ? 问题答案: 实际上没有区别。它 在java数组声明中。 第一种类型声明不那么令人困惑,至少对我而言:)。 注意: 我不确定为什么在声明时将长度设为 零 。 如果可能的话,请访问https://stackoverflow.com/a/19558179/1927832,以获取相对于其他方面的某些优势。