学习C语言的数组
不建议使用变量定义数组,如果使用了变量定义数组,作为数组的元素的个数,不初始化的情况下是随机值,如果初始化会直接报错
注意:如果定义的同时进行初始化,那么元素的个数可以省略
省略之后,初始化赋值几个数据,那么数组的长度就是几,也就是说数组将来就能存储几个数据。
int scores[] = {1,3};//只有两个存储空间了
如果没有进行初始化,就不能省略元素个数:
错误的:int scores[];
可以通过[]索引指定赋值
int scores[100] = {[87] = 1,[34] = 29};
获得数组的长度可以用sizeof
![复制代码](http://common.cnblogs.com/images/copycode.gif)
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 }
![复制代码](http://common.cnblogs.com/images/copycode.gif)
当数组名作为函数参数时, 因为自动转换为了指针类型,所以在函数中无法动态计算除数组的元素个数
1 void printArray(int array[]) 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)找出数组元素的最大值
![复制代码](http://common.cnblogs.com/images/copycode.gif)
1 int getMax(int ages[], int length) 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]; 15 16 return max; 17 }
![复制代码](http://common.cnblogs.com/images/copycode.gif)
![复制代码](http://common.cnblogs.com/images/copycode.gif)
1 int getMax(int ages[], int length) 3 // 把数组中的第0个索引作为最大值 4 int max = 0;// 是一个索引 5 for (int i = 1; i length; i++) { 6 if (ages[max] ages[i]) { 7 max = i; 10 return ages[max]; 11 }
![复制代码](http://common.cnblogs.com/images/copycode.gif)
前面一个算法,也是我开始的思路,不过我采用三元运算符替代了条件语句,虽然代码看起来精简,但是本质上没有啥改变。
然后我看到第二个算法,相比第一个算法思想,就是直接面向最大值编程,而第二个算法是面向最大值的索引编程,也就是说,如果这个值是最大的,那我就操作这个值得索引好了,反正通过索引就一定能够得到这个最大值。
不过第二种面向索引写算法的思想一般用在这种集合元素不变动的情况,如果集合在算法中变动的话,就有可能出现通过索引获取不正确的值。
好,阅读到这里,不管读者是重新阅读这段内容还是第一次阅读这段内容都尝试着不看源代码自己面向索引写这个小题的算法吧。
以下就是作者的练习代码:
![复制代码](http://common.cnblogs.com/images/copycode.gif)
1 #include stdio.h 2 3 //设计一个函数int arrayMax(int a[], int count)找出数组元素的最大值 4 //面向元素具体值写算法 5 int arrayMax(int a[],int count) 7 int max = a[0]; 8 for (int i=0; i count; i++) { 9 max = (max a[i])?max:a[i]; 11 return max; 13 14 //面向索引写算法 15 int arrayMax2(int a[],int count) 17 //定义一个最大值的索引,比如这里的最大值索引是数组中的第一个 18 int max = 0; 19 20 for (int i=0; i count; i++) { 21 max = (a[max] a[i])?max:i; 23 return a[max]; 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 }
![复制代码](http://common.cnblogs.com/images/copycode.gif)
面向索引值写的算法在集合类的使用中可以起到减少算法空间复杂度的作用。
因为索引所占的空间往往就是int的所占的空间。
相关文章
- C语言学习——指针精华(1)
- C语言学习——指针精华(2)
- C语言学习——结构体数据类型
- C语言教程学习26-35节 指针全内容第二部分31-35
- C语言教程学习1-13节
- C语言变量的存储方式、作用域和生命周期
- 小白学习C语言 第2 天
- C语言一维数组二维数组、字符数组【C语言学习笔记】
- 基于C语言的图书管理系统_c语言图书管理系统课程设计报告
- C语言位操作 | 按位运算符
- C语言教程学习 - 54课 总结 - 已完结
- Linux系统下学习C语言编程(linux系统的c代码)
- 语言Linux下C语言开发实践经验(linux的c)
- C语言轻松连接Oracle,实现高效数据处理(c语言调用oracle)
- 数据库学习C语言 玩转MySQL数据库(c语言与mysql)
- 学习Linux C语言程序设计,轻松掌握编程技能!(linuxc语言程序设计)
- 深入学习Linux网络编程和C语言技术。(linuxc网络编程)
- 深入学习Linux C语言编程(linux c i)
- C语言MySQL 初学者学习必备入门教程(c mysql入门教程)
- 利用C语言轻松实现Oracle连接池(c 连接池 oracle)
- 为什么要学习C语言C语言优势分析