A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 1115302782 中级黑马   /  2015-7-7 23:55  /  830 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//--------------------数组的初始化

类型说明符
          数组名[常量表达式] = { 值, 值......值 };
         

其中在{ }中的各数据值即为各元素的初值,各值之间用逗号间隔。



//--------------数组初始化的注意事项


1)指定元素的个数的同时,对所有的元素进行显式的初始化
int nums[5] = {1,2,3,4,5};


2)指定数组的元素个数,对数组进行部分显式初始化 定义的同时对数组进行初始化,没有显式初始化的元素,
那么系统会自动将其初始化为0
int num[5] = {1}   --->   1,0,0,0,0


3)不指定元素个数,定义的同时初始化,它是根据大括号中的元素的个数来确定数组的元素 个数
int nums[] = {1,2,3,5,6};


4)指定元素个数,同时给指定元素进行初始化
int nums[5] = {[4] = 3,[1] = 2};


给数组赋值的方法除了用赋值语句对数组元素逐个赋值外
还可采用初始化赋值和动态赋值的方法


使用变量定义的数组不可以定义数组的同时对数组进行初始化

int a = 6;
int nums[a];


先定义后初始化


数组没有初始化,数组里面是垃圾数
数组如果部分初始化,剩下的会自动初始化为0,所以是0

先定义后初始化,后初始化的只会对部分元素初始化,其余依旧是垃圾数
int a[10];
a[1] = 10;
a[5]?  //垃圾数


//------------------------------数组的引用
数组名[下标]
数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。

int a[3] = {1,2,3};
a[0] = 1;
a[1] = 2;
a[2] = 3;

a[3]?


正序输出

        for (int i=0; i<10; i++) {
   
        printf("%d\t",a[i]); }

逆序输出
                  
for (int j=9; j>=0; j--) {
   
                 printf("%d\t",a[j]); }


数组的遍历 --->  初始化
                    

for (int i=0;i<len; i++) {
   
                printf("请输入数组的第%d个值\n",i+1);
   
                    scanf("%d",&a[i]);
}

数组长度
定义数组
遍历





//----------------------------一维数组的存储方式
存储方式:

1)计算机会给数组分配一块连续的存储空间


2)数组名代表数组的首地址
从首地址位置,依次存入数组的第1个、第2个....、第n个元素


3)每个元素占用相同的字节数(取决于数组类型)


4)并且数组中元素之间的地址是连续。



一维数组的地址
在内存中,内存从大到小进行寻址,为数组分配了存储空间后,数组的元素自然的从上往下排列 存储,整个数组的地址为首元素的地址。



2)数组名存放的是数组的首地址
数组的首地址:数组的第一个元素首地址(第一个元素的第一个字节地址)

//-----------------------------计算数组长度
:sizeof(数组名)
数组的长度 = 数组占用的总字节数 / 数组元素占用的字节数



//-----------------------------数组的越界问题

总结:
一个长度为n的数组,最大下标为n-1, 下标范围:0~n-1
1、约错了对象(访问自己不该访问存储空间)

2、程序崩溃



//-------------------------找最大值

定义变量

遍历存入数组


假设max = a[0]

比较
if(a[i]>max) max=a[i];


//-------------------------数组元素作为函数参数

数组用作函数参数有两种形式:

    一种是把数组元素(下标变量)作为实参使用;
   
一种是把数组名作为函数的形参和实参

数组元素作函数实参,就是把数组元素的值传送给形参

数组名作为函数参数,就是把数组的地址传递过去


    1)用数组名作函数参数时,则要求形参和相对应的实参都必须是类型相同的数组



    2)在C语言中,数组名除作为变量的标识符之外,数组名还代表了该数组在内存中的起始地址, 因此,当数组名作函数参数时,实参与形参之间不是"值传递",而是"地址传递",实参数组名将 该数组的起始地址传递给形参数组,两个数组共享一段内存单元,编译系统不再为形参数组分配存储单元。


    3) 在变量作函数参数时,所进行的值传送是单向的。即只能从实参传向形参,不能从形参传回实 参。形参的初值和实参相同,而形参的值发生改变后,实参并不变化,两者的终值是不同的。




    注意点

    1形参数组和实参数组的类型必须一致,否则将引起错误。
   

2形参数组和实参数组的长度可以不相同
   

3在函数形参表中,允许不给出形参数组的长度,或用一个变量来表示数组元素的个数。


    4多维数组也可以作为函数的参数。
在函数定义时对形参数组可以指定每一维的长度,也可省去 第一维的长度。


sizeof(地址) -->  地址都是占8个字节


//------------------冒泡排序

大数下沉,小数上浮


1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。


2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。
在这一点,最后的元素应该会是最大的数。


3)针对所有的元素重复以上的步骤,除了最后一个。

4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
ß


for (int i=0; i<len-1; i++){
//每趟排序都会确定一个数,所以需要再循环len-i次,但因为每次都是
                           //相邻的两个数进行比较,为了a[j+1]不越界,让j循环到len-i-1时停止。
   
for (int j=0; j<len-i-1; j++) {
      
if(a[j]>a[j+1]){
            
  int temp = 0;
            
  temp = a[j];
            
  a[j]=a[j+1];
           
   a[j+1]= temp;
        
  }
   
}

}

2 个回复

倒序浏览
你总结的好多啊
回复 使用道具 举报
受教了,顶你
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马