初识C语言数组

本文介绍了C语言中数组的基本概念,包括一维数组和二维数组的创建、初始化和使用方法。强调了数组下标的使用,指出数组作为函数参数时,传递的是首元素的地址,并通过错误和正确示例说明了在传递数组给函数时需要提供数组长度的重要性。
摘要由CSDN通过智能技术生成

数组是一组相同类型元素的集合。

一、一维数组

1.创建和初始化

type_t   arr_name   [const_n];

//type_t 是指数组的元素类型

//const_n 是一个常量表达式,用来指定数组的大小

注:数组创建,在C99标准之前, [ ] 中要给一个常量才可以,不能使用变量。在C99标准支持了变长数组的概念。

数组可以全部初始化,也可部分初始化。部分初始化时,未初始化的部分默认赋值0。

数组长度可以省略,此时必须进行初始化,数组的元素个数根据初始化的内容来确定。

以下均为合法的初始化:

int arr1[10] = {1,2,3};                         //部分初始化,剩余元素为0

int arr2[] = {1,2,3,4};                          //数组长度为4

int arr3[5] = {1,2,3,4,5};        //全部初始化

char arr4[3] = {'a',98, 'c'};                 

char arr5[] = {'a','b','c'};

char arr6[] = "abcdef";                     //字符串结尾含有'\0',因此数组长度为7

2.使用

数组是使用下标来访问的,下标从0开始。如:arr[0]表示数组arr的第一个元素,[ ]为下标引用操作符。

数组的大小可以通过sizeof()计算得到:   sz=sizeof(arr)/sizeof(arr[0])

一维数组在内存中是连续存放的,随着下标的增大,元素的地址也随之递增。

二、二维数组

1.创建和初始化

二维数组最好按行进行初始化,其余规则与一维数组类似:

int arr[3][4] = {{1,2},{4,5}};//其余元素默认为0

int arr[][4] = {{2,3},{4,5}};//二维数组如果有初始化,行可以省略,列不能省略

2.使用

二维数组的使用也是通过下标的方式。行和列的下标都是从0开始的。

我们在理解时可以将二维数组看成行列的形式,但其实二维数组在内存中也是连续存储的。

tips:数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。 所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。

      C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,在写代码时一定要注意。

三、数组作为函数参数

我们在写代码的时候,往往会将数组作为参数传给函数,这样会将整个数组都传递过去吗?要想弄明白这个问题,我们首先得知道数组名是什么?

一般情况,数组名是数组首元素的地址。对于一维数组,数组名就是首个元素的地址;对于二维数组,二维数组可以理解为一维数组的数组,因此二维数组名是首个一维数组的地址,本质是数组指针。

特殊情况只有两种:①sizeof(arr),表示整个数组的字节大小    ②&arr,表示整个数组的地址。虽然它的值与数组首元素的地址相同,但表示的意义完全不同。     除此之外,所有出现数组名的地方都可以理解为首元素的地址。

因此,数组作为参数时,传给函数的只是首元素的地址。所以接收数组名的形参既可以写成数组的形式,也可以写成对应的指针形式。

例如冒泡排序函数的设计:

错误示例:

#include <stdio.h>
void bubble_sort(int *arr)
{
    int sz = sizeof(arr)/sizeof(arr[0]);  //arr为地址,因此sz的计算结果为1
    int i = 0;
    for(i=0; i<sz-1; i++)
    {
        int j = 0;
        for(j=0; j<sz-i-1; j++)
        {
            if(arr[j] > arr[j+1])
            {
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
}
int main()
{
    int arr[] = {3,1,7,5,8,9,0,2,4,6};
    bubble_sort(arr);
    for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

sz本应为数组的长度,因此无法达到排序的目的。应该提前将数组长度作为参数也传给函数。

正确示例:

void bubble_sort(int arr[], int sz) //参数接收数组长度
{
 //代码同上面函数
}
int main()
{
    int arr[] = {3,1,7,5,8,9,0,2,4,6};
    int sz = sizeof(arr)/sizeof(arr[0]);
    bubble_sort(arr, sz);  //将数组长度一并传给函数
    for(i=0; i<sz; i++)
   {
        printf("%d ", arr[i]);
   }
    return 0;
}

四、结尾

至此,函数与数组的分享暂时结束,接下来将更新两篇关于此应用实例的博客。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值