C语言的数组

数组声明的实例:int num[3];只要记下这个模板就好。

不建议使用变量定义数组,如果使用了变量定义数组,作为数组的元素的个数,不初始化的情况下是随机值,如果初始化会直接报错

注意:如果定义的同时进行初始化,那么元素的个数可以省略
省略之后,初始化赋值几个数据,那么数组的长度就是几,也就是说数组将来就能存储几个数据。
int scores[] = {1,3};//只有两个存储空间了
如果没有进行初始化,就不能省略元素个数:
    错误的:int scores[];

可以通过[]索引指定赋值
int scores[100] = {[87] = 1,[34] = 29};

获得数组的长度可以用sizeof

 #include <stdio.h>

 int main(int argc, const char * argv[]) {

     int a[];
printf("数组的长度:%i\n",(int)(sizeof(a)/sizeof(a[])));
return ;
}

当数组名作为函数参数时, 因为自动转换为了指针类型,所以在函数中无法动态计算除数组的元素个数

 void printArray(int array[])
{
printf("printArray size = %lu\n", sizeof(array)); //
int length = sizeof(array)/ sizeof(int); //
printf("length = %d", length);
}

小何说两句:
    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)找出数组元素的最大值

 int getMax(int ages[], int length)
{
// 注意:不要假设数组以外的值位最大值,会出现意想不到的问题
// int max = 0;
// 假设数组中的第0个元素是最大
int max = ages[]; for (int i = ; i < length; i++) {
// 判断从数组中取出的值是否大于max
if (max < ages[i]) {
// 如果大于max就把当前索引对应的元素设置成最大值
max = ages[i];
}
} return max;
}
 int getMax(int ages[], int length)
{
// 把数组中的第0个索引作为最大值
int max = ;// 是一个索引
for (int i = ; i < length; i++) {
if (ages[max] < ages[i]) {
max = i;
}
}
return ages[max];
}

前面一个算法,也是我开始的思路,不过我采用三元运算符替代了条件语句,虽然代码看起来精简,但是本质上没有啥改变。
然后我看到第二个算法,相比第一个算法思想,就是直接面向最大值编程,而第二个算法是面向最大值的索引编程,也就是说,如果这个值是最大的,那我就操作这个值得索引好了,反正通过索引就一定能够得到这个最大值。
不过第二种面向索引写算法的思想一般用在这种集合元素不变动的情况,如果集合在算法中变动的话,就有可能出现通过索引获取不正确的值。

好,阅读到这里,不管读者是重新阅读这段内容还是第一次阅读这段内容都尝试着不看源代码自己面向索引写这个小题的算法吧。
以下就是作者的练习代码:

 #include <stdio.h>

 //设计一个函数int arrayMax(int a[], int count)找出数组元素的最大值
//面向元素具体值写算法
int arrayMax(int a[],int count)
{
int max = a[];
for (int i=; i<count; i++) {
max = (max>a[i])?max:a[i];
}
return max;
} //面向索引写算法
int arrayMax2(int a[],int count)
{
//定义一个最大值的索引,比如这里的最大值索引是数组中的第一个
int max = ; for (int i=; i<count; i++) {
max = (a[max]>a[i])?max:i;
}
return a[max];
} int main(int argc, const char * argv[]) {
int a[] = {,,,,};
printf("最大值是:%d\n",arrayMax2(a,));
return ;
}

面向索引值写的算法在集合类的使用中可以起到减少算法空间复杂度的作用。
因为索引所占的空间往往就是int的所占的空间。

 

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

  1. 《C语言学习笔记》指针数组及其应用

    C语言中,最灵活但又容易出错的莫过于指针了.而指针数组,是在C中很常见的一个应用.指针数组的意思是说,这个数组存储的所有对象都为指针.除了存储对象为指针,即一个地址外,其它操作和普通数组完全一样. # ...

  2. Go语言学习笔记八: 数组

    Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...

  3. 菜鸟学习-C语言函数参数传递详解-结构体与数组 分类: C/C++ Nginx 2015-07-14 10:24 89人阅读 评论(0) 收藏

    C语言中结构体作为函数参数,有两种方式:传值和传址. 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数.在这种情况下 ...

  4. C语言学习笔记之动态分配数组空间

    本文为原创文章,转载请标明出处 高级语言写多了,再拿起C语言的时候,自己已经傻了... C语言中数组大小不能为变量,即使这个变量已经被赋过值了,应该使用malloc方法进行数组空间动态分配. 如下: ...

  5. 从零开始学习R语言(四)——数据结构之“数组(Array)”

    本文首发于知乎专栏:https://zhuanlan.zhihu.com/p/60141207 也同步更新于我的个人博客:https://www.cnblogs.com/nickwu/p/125677 ...

  6. go语言的 数组、slice、map使用(转)

    golang群 点击加入 go语言的 数组.slice.map使用, 由于网上有很好的说明, 不需要再写了,请看这几篇: Go语言中的 Array, Slice和 Map 深入学习golang五篇,以 ...

  7. iOS阶段学习第六天笔记(数组)

                                                                                                  iOS学习( ...

  8. 新学习的语言Groovy

    什么是 Groovy? Groovy 是 JVM 的一个替代语言 —替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同.在编写新应用 ...

  9. 漫谈C语言及如何学习C语言

    抄自:http://my.oschina.net/apeng/blog/137911 目录:[ - ] 为什么要学习C语言? C语言学习方法 1,参考书籍 2,动手实验环境搭建 3,网络资源 附录 一 ...

随机推荐

  1. solr的建议搭建

    公司培训了solr,我打算自己练练手!就下载了solr-4.4.0.zip~呵呵 1.基本环境Tomcat 1.6 和JDK1.6 2.解压solr-4.4.0.zip , 把dist/solr-4. ...

  2. bootstrap插件学习-bootstrap.carousel.js

    先看bootstrap.carousel.js的结构 var Carousel = function (element, options){} //构造器 Carousel.prototype = { ...

  3. Tips2:无需Gizmo函数 和 附加Render 实现空物体(GameObject)的可视化

    Unity在场景创建过程中,可能会用到很多空物体,如生成器(Spawn)什么的,一般空物体默认是看不到的,其实,空物体可以通过设置为可见的,这样在用到空物体时就能更加方便的编辑和控制了. 1.可以是这 ...

  4. 探秘空值位图掩码(NULL bitmap mask)

    这篇文章我想谈下空值位图掩码(NULL bitmap mask) ,并揭开它的神秘面纱.空值位图掩码是在存储引擎层为列是否存储NULL值进行编码.它是一个简单的位图掩码,如果值是1的话,表示这列有NU ...

  5. sysbench测试服务器性能

    sysbench目前已经有0.5的版本,不过最普遍使用的依旧是0.4.12,所以接下来我们会以0.4.12这个版本作为测试 Step1:下载安装sysbench wget http://pkgs.fe ...

  6. C#中 导入和导出Excel的方法

    using System.Data; using System.Data.OleDb; /// <summary> /// Excel转为DataTable /// </summar ...

  7. 重新想象 Windows 8.1 Store Apps (74) - 新增控件: Flyout, MenuFlyout, SettingsFlyout

    [源码下载] 重新想象 Windows 8.1 Store Apps (74) - 新增控件: Flyout, MenuFlyout, SettingsFlyout 作者:webabcd 介绍重新想象 ...

  8. WebGL/X3DOM 跑在 iOS

    iOS是最早支持WebGL的移动操作系统之一,我们一直在努力让X3DOM运行在那些设备上.然而,标准的Safari浏览器默认是没有开启的.这种情况从iOS8发生改变,iOS8现在完全支持WebGL - ...

  9. 小白学Linux(二)--命令行基本操作

    安装完Ubuntu后,进入系统,呈现在眼前的是Ubuntu的界面,跟windows的差不太多.一般操作系统包含GUI和CLI.GUI就是我们现在看到的,也是windows常用的直接用拖拽,点击等操作对 ...

  10. custom struts framework

    1. Difference between stucts1 and struts2 struts1 : Servlet used as Controller , you can visit the S ...