Linux学习之路(番外--数组)

什么是数组:

  在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组

 

       在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。

 

       每一个变量对应一块内存空间,

       如果是整型int,则需要 4个字节的内存空间

       如果是字符型char,则需要 1个字节的内存空间

 

数组是一组具有相同数据类型的元素的集合

假设现在我需要10个int型数据,那么就需要10个int的内存空间

下面的定义:

int a[10]; 

就在内存中分配了10个int的空间,共有10*4 = 40个字节,并为它们起了一个名字叫a

我们把这样的一组数据的集合称为数组(Array,它所包含的每一个数据叫做数组元素(Element,所包含的数据的个数称为数组长度(Length

例如int a[10];就定义了一个长度为10的整型数组,名字是a。

数组中的每个元素都有一个序号,这个序号从0开始,而不是从我们熟悉的1开始,称为下标(Index。使用数组元素时,指明下标即可,形式为:

 

 

 

一位数组:

什么是一维数组       

        所谓一维数组就是指数组定义的时候数组名后面只有一个下标的数组,这里只有一个下标的意思是说数组名后面只有一个[], 比如 int a[10],而像int  a[2][3]有多个[]的就不叫一维数组了。

 

 

定义方式

数据类型  数组名[数组长度];

例如:

float m[12];  // 定义了一个有12个元素的浮点型数组,每个元素都是浮点型

char ch[9];   // 定义了一个有9个元素的字符型数组,每个元素都是字符

注意

数组中每个数据的类型是相同的。

数组长度 length 必须是整数或者常量表达式不能是变量

数组下标的取值范围为 0 ≤ index < length

数组在内存中的存储空间是连续的

可以通过sizeof(数组名)来获取数组所占空间大小,通过sizeof(数组名)/sizeof(数组类型)获得数组的长度

printf ("%d\n", sizeof(a));

printf ("%d\n", sizeof(a) / sizeof(int));

 

 

 

元素使用

// 给数组元素赋值

for (i = 0; i < 10; i++)

{

a[i] = i; // a[0] = 0; a[1] = 1; a[2] = 2; .... a[9] = 9

}

 

// 打印数组

for (i = 0; i < 10; i++)

{

    printf ("%d\n", a[i]);

}

 

    

一维数组初始化

全部初始化

  • 定义数组的同时对数组元素进行赋值,以逗号进行分割
  • 给全部元素赋值,那么在数组定义时可以不给出数组的长度

int a[10] = {20, 1, 2, 3, 4, 5, 6, 7, 8, 9};

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

部分初始化

  • 只给数组前面几个元素赋值,剩余部分全部默认为0
    int a[10] = {2, 5, 6};
    a[0] = 2, a[1] = 5, a[2] = 6,剩余的元素值都是0

 

使用技巧

初始化的时候将数组第一个元素设置为0,其他元素不赋值,则数组中所有元素值都为0

int a[10] = {0};

 

 

二维数组:

什么是二维数组       

       

       一维数组可以看作是一行连续的数据,只有一个下标,称为一维数组。在实际问题中有很多数据是二维的或多维的,因此C语言允许构造多维数组。多维数组元素有多个下标,以确定它在数组中的位置

 

 

定义方式

数据类型  数组名[数组长度][数组长度];

例如:

int a[3][4]

定义了一个3行4列的数组,共有3×4=12个元素,数组名为a,即:

a[0][0], a[0][1], a[0][2], a[0][3]   == > a[0]

a[1][0], a[1][1], a[1][2], a[1][3]   == > a[1]

a[2][0], a[2][1], a[2][2], a[2][3]   == > a[2]

注意

在二维数组中,要定位一个元素,必须给出一维下标和二维下标,就像在一个平面中确定一个点,要知道x

坐标和y坐标。例如,a[3][4] 表示a数组第4行第5列的元素。

二维数组在概念上是二维的,但在内存中地址是连续的,也就是说各个元素是相互挨着的。

二维数组可以看作是由一维数组嵌套而成的,把一维数组的每个元素看作一个数组,就组成了二维数组

如二维数组a[3][4],可分解为三个一维数组,其数组名分别为:a[0]、a[1]、a[2]。

对这三个一维数组不需另作说明即可使用。这三个一维数组都有4个元素,例如:一维数组a[0]的元素为

a[0][0], a[0][1], a[0][2], a[0][3]。

 

 

二维数组初始化

二维数组的初始化可以按行分段赋值,也可按行连续赋值。

例如对数组a[5][3]

按行分段赋值可写为:

int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };

按行连续赋值可写为:

int a[5][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};

可以只对部分元素赋初值,未赋初值的元素自动取0值

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

是对每一行的第一列元素赋值,未赋值的元素取0值。 赋值后各元素的值为:

1  0  0

2  0  0

3  0  0

如对全部元素赋初值,则第一维的长度可以不给出

int a[3][3]={1,2,3,4,5,6,7,8,9};

可以写为:

int a[][3]={1,2,3,4,5,6,7,8,9};

 

二维数组的使用

// 二维数组的赋值

    for (i = 0; i < 2; i++)

    {

        for (j = 0; j < 3; j++)

        {

            a[i][j] = i*3+j;

        }

    }

 

    // 二维数组的打印

    for (i = 0; i < 2; i++)

    {

        for (j = 0; j < 3; j++)

        {

            printf ("%4d", a[i][j]);

        }

        printf ("\n");

    }

 

 

 

字符数组:

什么是字符数组   

              

用来存放字符的数组称为字符数组

 

定义方式

char a[10];     // 一维字符数组

char b[5][10];  // 二维字符数组

       字符数组实际上是一系列字符的集合,也就是字符串(String。在C语言中,没有专门的字符串变量,没有string类型,通常就用一个字符数组来存放一个字符串

 

 

字符数组初始化

普通数组的初始化方式对字符数组同样适用

char str[30] = {0};                        // 全部初始化为0

char str[30] = {'h', 'e', 'l', 'l', 'o'};  // 部分初始化     

 

可以将字符串直接赋值给字符数组

char str[30] = {"helloworld"};

char str[30] = "helloworld";        //这种形式更加简洁,实际开发中常用

注意

C语言中,字符串总是以'\0'作为串的结束符。上面的两个字符串,编译器已经在末尾自动添加

了'\0'。'\0'是ASCII码表中的第0个字符,用NULL表示,称为空字符。该字符既不能显示,也不是控制字符,输出该字符不会有任何效果,它在C语言中仅作为字符串的结束标志。

 

 

 

字符串的输入输出

 printf 在输出字符串时会逐个扫描字符,直到遇见 '\0' 才结束输出

printf 用 %s 输出字符串

char str1[30] = "hello";

char str2[] = "abcdef";

char str3[30] = "You are a good\0 boy!";

printf("str1: %s\n", str1);

printf("str2: %s\n", str2);

printf("str3: %s\n", str3);

 

用scanf用%s进行字符串的输入, 遇空格或回车结束

char s[10] = { 0 };

scanf("%s", s);

printf("%s\n", s);

注意

  • scanf 不能读取 空格回车键
  • scanf读取的长度大于数组的长度,会导出数组越界
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值