C语言的数组
数组声明的实例:int num[3];只要记下这个模板就好。
不建议使用变量定义数组,如果使用了变量定义数组,作为数组的元素的个数,不初始化的情况下是随机值,如果初始化会直接报错
注意:如果定义的同时进行初始化,那么元素的个数可以省略
省略之后,初始化赋值几个数据,那么数组的长度就是几,也就是说数组将来就能存储几个数据。
int scores[] = {1,3};//只有两个存储空间了
如果没有进行初始化,就不能省略元素个数:
错误的:int scores[];
可以通过[]索引指定赋值
int scores[100] = {[87] = 1,[34] = 29};
获得数组的长度可以用sizeof
1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) { 4 5 int a[5]; 6 printf("数组的长度:%i\n",(int)(sizeof(a)/sizeof(a[0]))); 7 return 0; 8 }
当数组名作为函数参数时, 因为自动转换为了指针类型,所以在函数中无法动态计算除数组的元素个数
1 void printArray(int array[]) 2 { 3 printf("printArray size = %lu\n", sizeof(array)); // 8 4 int length = sizeof(array)/ sizeof(int); // 2 5 printf("length = %d", length); 6 }
小何说两句:
1.看样子,在C语言中无法将动态计算数组长度的方法模块化编程
2.在java中中的数组是可以这样的:
public class Main{
public static void main(String[] args){
int n = 10;
int a[] = new int[n];
System.out.println(a.length);
}
但是在C语言中,是不能用变量如上面Java代码这样可以动态指定数组声明时的长度的。
int a = 10;
int b[a];
但是在java语言中,数组的声明不能指定长度,也就是不能这样int[3] a或者int a[3],java只能在初始化的时候指定数组长度。
在C++中声明数组也是和C语言一样的,声明格式:
数据类型 数组名[常量表达式] 例如:int array[10];常量表达式中可以包括整型常量和整型表达式,但不能是变量。
C++和C语言不允许对数组的大小作动态定义。
在Swift和Objective-C中,数组的长度是动态可变的。
3.但是C语言在访问数组的时候,指定索引可以用变量来指定。比如;
int a[3]={1,2,3};
int n = 2;
printf("%d\n", a[n]);
小何说两句习题的一个知识亮点:
虽然这是一个很简单的习题,但是其中的小思想是可以积累的。
##1.设计一个函数int arrayMax(int a[], int count)找出数组元素的最大值
1 int getMax(int ages[], int length) 2 { 3 // 注意:不要假设数组以外的值位最大值,会出现意想不到的问题 4 // int max = 0; 5 // 假设数组中的第0个元素是最大 6 int max = ages[0]; 7 8 for (int i = 0; i < length; i++) { 9 // 判断从数组中取出的值是否大于max 10 if (max < ages[i]) { 11 // 如果大于max就把当前索引对应的元素设置成最大值 12 max = ages[i]; 13 } 14 } 15 16 return max; 17 }
1 int getMax(int ages[], int length) 2 { 3 // 把数组中的第0个索引作为最大值 4 int max = 0;// 是一个索引 5 for (int i = 1; i < length; i++) { 6 if (ages[max] < ages[i]) { 7 max = i; 8 } 9 } 10 return ages[max]; 11 }
前面一个算法,也是我开始的思路,不过我采用三元运算符替代了条件语句,虽然代码看起来精简,但是本质上没有啥改变。
然后我看到第二个算法,相比第一个算法思想,就是直接面向最大值编程,而第二个算法是面向最大值的索引编程,也就是说,如果这个值是最大的,那我就操作这个值得索引好了,反正通过索引就一定能够得到这个最大值。
不过第二种面向索引写算法的思想一般用在这种集合元素不变动的情况,如果集合在算法中变动的话,就有可能出现通过索引获取不正确的值。
好,阅读到这里,不管读者是重新阅读这段内容还是第一次阅读这段内容都尝试着不看源代码自己面向索引写这个小题的算法吧。
以下就是作者的练习代码:
1 #include <stdio.h> 2 3 //设计一个函数int arrayMax(int a[], int count)找出数组元素的最大值 4 //面向元素具体值写算法 5 int arrayMax(int a[],int count) 6 { 7 int max = a[0]; 8 for (int i=0; i<count; i++) { 9 max = (max>a[i])?max:a[i]; 10 } 11 return max; 12 } 13 14 //面向索引写算法 15 int arrayMax2(int a[],int count) 16 { 17 //定义一个最大值的索引,比如这里的最大值索引是数组中的第一个 18 int max = 0; 19 20 for (int i=0; i<count; i++) { 21 max = (a[max]>a[i])?max:i; 22 } 23 return a[max]; 24 } 25 26 int main(int argc, const char * argv[]) { 27 int a[5] = {12,2,2,3,23}; 28 printf("最大值是:%d\n",arrayMax2(a,5)); 29 return 0; 30 }
面向索引值写的算法在集合类的使用中可以起到减少算法空间复杂度的作用。
因为索引所占的空间往往就是int的所占的空间。