学习C语言的数组

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的所占的空间。

时间: 2024-10-01 04:15:31

学习C语言的数组的相关文章

c语言基础-刚刚学习c语言的数组部分,不懂,求助一下!

问题描述 刚刚学习c语言的数组部分,不懂,求助一下! 输入一组整数,将它们排序后按照由小到大的顺序输出,不知道要不要用到循环语句,求助这个这个程序怎么写 解决方案 #include <stdio.h>void main() { int i, j, temp; int a[10]; for (i = 0; i < 10; i++) { scanf("%d,", &a[i]); } for (j = 0; j < 9; j++) { for (i = 0;

C语言的数组学习入门之对数组初始化的操作_C 语言

数组在所有的语言中,以C最为简单,就是一起始地址,外加一数组的长度,而且基本上没有任何功能可言.然而,在所有的数组使用中,却是C的这种简单的数组形式,以其灵活性和效率,让人惊叹. C数组从逻辑上讲,是分形一致的(想不到其他词来形容了),分形的意思,就是部分与整体保持一致的构造形式,也即是数组的任何一部分也都是数组,比如一整型数组{1,2,3,4,5},连续取出其中任一连续的部分,都可以看成是一个数组,{2,3}是数组,{1,2,3}是数组,{4,5}也都是数组,差别只在于数组的起始地址和元素的个

C语言一维数组初步学习笔记_C 语言

数组 可以存储一组或者多组数值的变量,里面包含多个元素,数组的每个成员都是一个数组元素. 一维数组 定义:类型 数组名[常量表达式] = {值1, 值2, 值3-}; int a[3] = {0, 1, 2}; float f[2] = {1.2, 2.3, 3.14}; char str[] = {'h', 'e', 'l', 'l', 'o'}; chat str1 = "iPhone";//这也是定义字符数组的方法,字符数组后面会详细讲解,这里先了解一下 当数组元素个数为变量时,

学习JAVA语言过程中可能遇到的共同问题

这节教程将讨论一些在学习JAVA语言过程中可能遇到的共同问题. 问题一:编译器找不到类. 解决方法: 确保你已经导入了类或者它的包. 如果对CLASSPATH环境变量有进行设置,要重新复位. 确保类名的拼写跟定义的一样,要注意大小写问题. 如果类在包中,要确保它们处在正确的子目录中. 同时,一些程序员从.java文件名字为类使用不同的名字.要确保你是使用类名字而不是文件名.实际上,使类名和文件名相同就不会出现这个错误了. 问题二:注释器不能找到其中一个类 解决方法: 确保你指定的是类名而不是类的

磁盘-新手学习C语言文件,问题已经在程序中备注,求解答!

问题描述 新手学习C语言文件,问题已经在程序中备注,求解答! //怎样向文件读写字符 #include #include int main() { FILE * fp; char ch,filename[10]: printf("请输入所用的文件名:"); scanf("%s",filename); if((fp = fopen(filename,"w")) == NULL)//为什么这里的filename没有双引号引起来: { printf(&

通过这九本开源好书学习 C 语言

书是非常私人的东西,编程类书籍也不例外.我们都是通过阅读书籍来帮助掌握某种语言的基本知识.随后又通过阅读书籍来全面探索这门语言的灵活性.我仔细考察了一些我最喜爱的 C 语言书籍,并从其中选出了对我意义最大的九本. C 语言是一种通用的.面向过程的高级编程语言.也是最具流行度和影响力的编程语言之一.该语言在设计时就被设计为可以通过编译器进行编译,以此来对内存进行底层操作.高效地执行机器指令以及在运行时仅需要最小的支持.很多很多编程语言都得益于 C 语言, C 语言就像是编程界的通用语言一样. C

c语言中数组名a和&amp;a详细介绍

其实这两个东西挺难理解的,应该也没有那么重要,了解一下好了,主要还是要多多理解数组指针的运算 最近又把学习c语言提上日程上来了~~~先把我打算看的书都写下来吧,<C语言深度剖析>,<c和指针>系类,<c语言陷阱和缺陷> 先说说a和&a的区别(有三点,三个方向): 是a和&a的本质,都是什么类型的. 从2维数组的角度看. 从指针运算的角度看. 声明:虽然数组名不是指针,但是用的很像指针,我们暂且把它叫做一个指针吧. 第一个问题: int a[10]; a

c语言中数组名a和&amp;amp;a详细介绍_C 语言

最近又把学习c语言提上日程上来了~~~先把我打算看的书都写下来吧,<C语言深度剖析>,<c和指针>系类,<c语言陷阱和缺陷> 先说说a和&a的区别(有三点,三个方向):1.是a和&a的本质,都是什么类型的.2.从2维数组的角度看.3.从指针运算的角度看. 声明:虽然数组名不是指针,但是用的很像指针,我们暂且把它叫做一个指针吧. 第一个问题:int a[10];  a ,&a和&a[0] 都是分别是什么?先说明a ,&a和&

JavaScript学习笔记之ES6数组方法_javascript技巧

ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony(和谐之意,显然没有跟上我国的步伐,我们已经进入中国梦版本了).上一次标准的制订还是2009年出台的ES5.目前ES6的标准化工作正在进行中,预计会在14年12月份放出正式敲定的版本.但大部分标准已经就绪,且各浏览器对ES6的支持也正在实现中. ES6给数组添加了一些新特性,而这些新特性到目前为止完全可以运用到自己的业务层.在这一节中将总结有关于ES6给数组提供一些新特性的使用方法. ES6提供