C语言8-数组

1.C语言中的变量存储地址

在学习C语言中的数组之前我们有必要了解一下变量在内存的存储的地址

我们前面知道了C语言中的变量是先定义在使用的原则,而且还需要注意,虽然定义了变量,但是不给变量初始化就直接打印是允许的但是这样得到的数据是垃圾数据

并不能每次都能保证数据为0,我们这里要讨论的时C语言中变量的存储地址问题,我们知道在不同的编译环境中不同类型的变量所分配的内存空间是不同的,这里我们

以16位编译器环境下为准,下面我附上一张C语言中不同的数据类型在不同编译环境下所占的内存字节数

#include <stdio.h>

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

    char a = 'A';
    int b = 66;
    printf("%x\n%x\n",&a,&b);  //查看
    return 0;
}

 

从我们给的图可以看到在16位编译下,char占一个字节,int占两个字节,我们把第一个字节的地址叫做变量的地址

 

2.一维数组的定义

当我们需要创建多个变量的时候我们不可能依次的创建,这个时候我们就引入的数组,数组会在内存中连续分配一片内存空间用来存储指定数据类型数据

一维数组定义的格式:数据类型 数组名[数组元素个数],这里注意数组元素个数必须是整数,整数常量,整数常量表达式(例如3*5),不能是变量也变量表达式(例如x*y)

#include <stdio.h>

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

    //int a[5];       //正确写法
    
    int b = 5;
    int c[b];         //错误写法,变量不能作为数组元素个数
    
    int d[];        //错误写法,没有指定数组元素个数
    
    int[5] e;       //错误写法,C语言中数组的格式为:数据类型 数组名[数组元素个数]
    return 0;
}

 

 

3.一维数组在内存中存储

在前面我们知道了变量在内存中存储的形式,数组也会在内存中连续分配一片空间,这片空间的第一个地址就是这个一维数组的地址,也就是数组第一个元素的地址,这里还要注意,数组名

就是这个数组的地址,所以数组名就是一个常量,是不能改变的

#include <stdio.h>

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

    int a[3];
    int i;
    for(i=0;i<5;i++){
        printf("%x\n",&a[i]);
    }

    return 0;
}

 

 

4.一维数组的初始化

当我们定义了一维数组之后指定了数组元素个数,这个时候我们如果要初始化这个数组,

我们可以在后面跟入{数组元素1,数组元素2,数组元素3...},如果是这样初始化数组,我们可以写全数组元素个数,也可以至少写一个数组元素,其它没有写的数组元素值为0

当然我们也可以对单个单个数组元素进行赋值,

如果是第一种初始化,如果在{}中确定了几个数组元素,我们可以在数组定义时不写入数组元素个数

#include <stdio.h>

int main(int argc, const char * argv[])
{
    
    int a[5] = {1,2,3,4,5}; //一般定义和初始化一维数组的
    int b[3];               //先定义数组,然后在单个单个的赋值
    b[0] = 0;
    b[1] = 1;
    b[2] = 2;
    int c[] = {1,2,3};      //在初始化一维数组时当在{}确定了多少个数组元素个数,我们可以在数组定义的时候不在[]中制定数组元素个数
    
    return 0;
}

 

 

5.数组元素和数组名称作为函数实际参数的不同

数组的元素作为函数的实际参数传递,并且在函数中改变形式参数的值是不会改变数组元素的值的,因为在传递的过程中相当于将数组元素的值赋值给函数的形参数

而当将数组名作为函数的实际参数传递时,在函数中改变形式参数的值也会数组中的值的,这时因为数组名是一个地址常量,我们传递给函数的是一个地址,当改变在函数中改变形式参数的值时

也会改变数组的值,所以按值传送不会改变数组的值,按引用传送会改变数组的值

#include <stdio.h>

void test(int a)
{
    a = 1;
}

int main(int argc, const char * argv[])
{
    int a[3];
    a[0]=2;
    printf("%d\n",a[0]);
    test(a[0]);    //按值传递不会改变数组的值
    printf("%d\n",a[0]);
    
}

 

结果为2,2

#include <stdio.h>

void test(int a[])
{
    a[0] = 1;
}

int main(int argc, const char * argv[])
{
    int a[3];
    a[0]=2;
    printf("%d\n",a[0]);
    test(a);   //按引用传递会改变数组的值
    printf("%d\n",a[0]);
    
}

结果为2,1

 

6.二维数组的定义存储和初始化

二维数组的定义格式:数据类型 数组名[行数] [列数],这里注意

二维数组在内存中存储,记住二维数组名和二维数组中的一维数组名都是常量,都是地址,是不能改变的,另外二维数组名等于二维数组中第一个一维数组名等于二维数组中一维数组中的第一个元素的地址值

#include <stdio.h>


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

    int a[2][3];
    printf("%d,%d,%d\n",a,a[0],&a[0][0]);  //三个结果相同
    return 0;
    
}

二维数组的初始化可以按行给元素,也可以按次序给元素,也可以给部分列中数据,还有注意一点我们可以省略行数,但是不能省略列数

#include <stdio.h>


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

    int a[2][3]={{1,2,3},{4,5,6}};  //按行给元素
    int b[2][3]={1,2,3,4,5,6};      //按次序给元素
    int c[2][3]={{1}};              //只给了部分列中数据,其它没有给的值为0
    int d[2][3]={{},{1}};           //只给了部分列中数据,其它没有给的值为0
    int e[][3]={{1,2,3},{4,5,6}};   //可以省略行数,但是列数不能省略

    return 0;
    
}

 

 

总结:本节课主要讲解了6点

  1.C语言中不同数据类型的变量在内存中存储所占的空间大小在不同的编译环境下是不同的,但无论什么数据类型的变量,在内存中存储的第一个地址即是变量的地址  

  2.一维数组的定义格式:数据类型 数组名[数组元素个数],但是注意数组元素个数只能是整数常量,整肃常量表达式,不能为变量,变量表达式

  3.一维数组在内存的存储会分配一片连续的空间,并且数组名就是这个数组的地址,数组名它是一个常量,是不会改变的,数组名就等于第一个元素的地址

  4.一维数组的初始化,一维数组的初始化可以一次性在{}中将数组元素的值给完,也可以至少给一个数组元素,其它没有给数组元素的值为0,也可以单个单个为数组元素给值

  5.当数组中的元素作为函数实参传递时,然后在函数中改变实际参数的值,此时数组中的元素的值不变,然而当数组名作为函数实参传递,然后在函数中改变数组中的值,此时数组中的值

   会改变,这就是按值传递不会改变数组中的值,按引用传递数组会改变数组中的值

  6.二维数组的定义存储初始化

    二维数组的定义格式:数据类型 二维数组名[行数][列数]

    二维数组的存储:二维数组名和二维数组中的一维数组名都是常量,都是地址是无法改变的,二维数名即是二维数组地址即是二维数组中第一个一维数组名还是第一维数组第一个元素的地址

      二维数组的初始化:二维数组的初始化可以按照行给元素,也可以按照次序给元素,还可以给部分元素给行,另外在初始化二维数组的时候我们还可以省略行数,但是不能省略列数

  

——————————————————————————————————————————————————————————————————————————————————————

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2014-02-22 22:24  ysfox  阅读(217)  评论(0)    收藏  举报