C语言数组

本文介绍了C语言中数组的作用,包括节省存储空间和方便处理相同类型的数据。详细阐述了数组的声明、初始化方法,以及如何访问和修改数组元素。还提到了数组作为函数参数和返回值的注意事项,并给出了二维数组的声明和使用示例。
摘要由CSDN通过智能技术生成

1数组的作用

为什么要使用数组?
在C语言中,很多时候需要用到很多相同类型的数据,如果把这些数据保存在不同的变量中,那就需要定义很多这样的变量,在这个时候,就可以使用数组,将这些数据放在数组中。

2数组的声明

数组类型 数组名[元素个数];
如:
int aar1[10]; //声明一个int数组,最多存放10个整形的元素
float aar2[5]; //声明一个float数组,最多存放5个浮点数的元素
char arr3[100]; //声明一个char数组,最多存放100个char的数据
【注意】如果只是对数组进行声明,必须写明元素个数,如 int aar [ ]; 是错误的

3数组的初始化

①int a[5] = {1,2,3,4,5}; //对数组整体赋值
int a[5];
a[5] = {1,2,3,4,5}; //如果声明数组时没有初始化,那么之后就不能对数组进行整体赋值,这种后面赋值是错误的
②int a[ ] = {1,2,3,4,5}; //初始化数组时,元素个数可以省略,自动分配元素个数
③int a[5]= {1,2,3}; //部分初始化,没有赋值的元素的值为0
④int a[5] = {0}; //五个元素值为0 ,如果说花括号里面没有元素,那就默认为0
⑤int a[5]; //如果说没有赋值的话,打印五个数,五个元素值为随机数,

⑥可变长数组
int n;
scanf(“%d”,&n);
int a[n]; //可变长数组不能再直接初始化

4、访问数组元素

通过数组名+数组下标(索引值)可以访问数组元素
数组下标范围:0~元素个数-1
int arr[5]={1,2,3,4,5};
for(int i=0;i<5;i++)
{
arr[i]=i;
printf(“arr[%d]=%d\n”,i,arr[i]);
}
运行结果:
arr[0]=0
arr[1]=1
arr[2]=2
arr[3]=3
arr[4]=4
【注意】:在c和c++中编译器不会对越界做错检查(程序中的一点小bug),所以如果说打印arr[5]编译器是会通过的,但运行结果是未知的,可能是一个随机数,但也有可能导致这段程序出现错误
【练习】:
①从键盘输入数据对数组赋值
②计算并打印数组元素的最大值,最小值和平均值

#include<stdio.h>
int main(void)
{
    int a[10],max,min,sum=0;
    float average;
    for(int i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
        sum+=a[i];
        
    }
    max=a[0];
    min=a[0];
    for(int i=0;i<10;i++)
    {
/*         if(a[i]>max)
        {
            max=a[i];
        }
        if(a[i]<min)
        {
            min=a[i];
        } */
        max=a[i]>max?a[i]:max;//用三目运算判断最大值与最小值代码更加简洁
        min=a[i]<min?a[i]:min;
    }
    average=(float)sum/10;
    printf("average=%.2f\n",average);
    printf("max=%d\n",max);
    printf("min=%d\n",min);

}

5、字符型数组

char str[5] = {‘1’,‘2’,‘3’,‘4’,‘5’}; //字符数组
等价于char str[5] = {49,50,51,52,53};
‘0’ :字符0的ASCII码是从48开始,所以说str[5] = {49,50,51,52,53};–>12345

#include<stdio.h>
int main(void)
{
    char str1[5]={'1','2','3','4','5'};
    printf("%s\n",str1);
    char str2[5]={49,50,51,52,53};
    printf("%s\n",str2);
}
运行结果:
12345
12345

char str[10];
输入:scanf(“%s”,str);
输出:printf(“%s”,str);
int arr[5] = {1,2,3,4,5};
字符数组可以通过%s连续输入输出,原因是字符数组的每个元素是一个字节,是连续的。
在C语言中,可以用字符数组来表示字符串,字符串用双引号括起来,都是以\0结尾的。
char str[10] = {‘1’,‘2’,‘3’,‘4’,‘5’};不等价于char str[10] = “12345”;
char str[10] = {‘1’,‘2’,‘3’,‘4’,‘5’,‘\0’};等价于char str[10] = “12345”;
【注意】字符串都是"\0" 结尾
char str[10] = {‘1’,‘2’,‘3’,‘4’,‘5’}; //这个不是"\0" 结尾这个不属于字符串,只是一个字符数组

6、一维数组名

int arr[5]; //arr是数组名
(1)数组名arr表示首元素(arr[0])地址,即:arr ====&arr[0]
(2)&arr是整个数组的地址

arr是数组名是首元素(arr[0])的地址
在这里插入图片描述
arr+1====&arr[1]
&arr+1 -->整个数组下一个的地址
【注意】:
arr ====&arr[0] (arr等价于arr[0]的地址)
&arr是整个数组的地址

7、数组作为函数的参数

方式1:【推荐】
void func(int *arr,int len) //数组作为函数的参数使,一般要额外传数组的长度(除char外)
{
}
方式2:
void func(int arr[10])
{
}
方式3:
void func(int arr[])
{
}
调用:
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
func(arr);
【注意】数组作为函数的参数时,会自动退化为指针。字节数都是指针的字节长度都为8字节

#include<stdio.h>
#include<string.h>
void  func1(int  *arr,int len)   //数组作为函数的参数使,一般要额外传数组的长度(除char外)
{
    for(int i=0;i<len;i++)
    {
        arr[i]=i;
        printf("a[%d]=%d\n",i,arr[i]);
    }
}

void  func2(int  arr[10],int len)
{
    for(int i=0;i<len;i++)
    {
        arr[i]=i;
        printf("a[%d]=%d\n",i,arr[i]);
    }
}

void  func3(int  arr[],int len)
{
     for(int i=0;i<len;i++)
    {
        arr[i]=i;
        printf("a[%d]=%d\n",i,arr[i]);
    }
}
int main(void)
{
    int  arr[10] = {1,2,3,4,5,6,7,8,9,10};
    func1(arr,10);
    func2(arr,10);
    func3(arr,10);

}

运行结果:
都是一样的
a[0]=0
a[1]=1
a[2]=2
a[3]=3
a[4]=4
a[5]=5
a[6]=6
a[7]=7
a[8]=8
a[9]=9

8、数组作为函数的返回值

C 语言不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。我们将在下一章中讲解有关指针的知识,您可以先跳过本章,等了解了 C 指针的概念之后,再来学习本章的内容。
如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,
C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。

int* func(void)
{
static int arr[5] = {1,2,3,4,5};
return arr;
}
【注意】函数中不能返回一个局部变量数组,要返回数组,可以在数组声明时加上static

#include<stdio.h>
#include<string.h>
int* func(void)
{
    static int arr[5] = {1,2,3,7,8};
    return arr;
}
int main(void)
{
    int *p=func();
    for(int i=0;i<5;i++)
    {
        printf("%d\n",p[i]);
    }
    
}
如果说没有static就不能返回arr的地址值

9、二维数组

(1)声明:数据类型 数组名[m][n];
如:int arr[3][2]; //3,表示有3个一维数组,2,表示每个一维数组最多存放2个元素
3个一维数组:arr[0]、arr[1]、arr[2]
6个元素:arr[0][0] arr[0][1] arr[1][0] arr[1][1] arr[2][0] arr[2][1]

(2)初始化
①int arr[3][2] = {1,2,3,4,5,6};
等价于int arr[3][2] = {{1,2},{3,4},{5,6}};
等价于int arr[ ][2] = {{1,2},{3,4},{5,6}};
②int arr[3][2] = {1,2,3};
等价于int arr[3][2] = {{1,2},{3,0},{0,0}};
【注意】二维数组的第一个元素个数可以省略,但是第二个不能省略;
字符二维数组:
char str[3][10] = {“www”,“baidu”,“com”};// 表示三个一维数组,最多存放10个char的数据
str[0]—>“www” (数组0)
str[1]—>“baidu” (数组1)
str[2]—>“com” (数组2)

10、二维数组名

int arr[3][2];
arr 二维数组名,地址
arr[0] 第一个一维数组名,地址
arr[0][0] 第一个一维数组的第一个元素
&arr[0] 整个第一个一维数组的地址
&arr[0][0] 第一个一维数组的第一个元素地址
arr ==== &arr[0]
arr[0] ==== &arr[0][0]

例题

在这里插入图片描述
求元素地址
正确答案:B
A:p[2] -->&p[2][0] 超出地址范围
B:p[0]+1–>&p[0][0]+1–>&p[0][1] 正确
C: *(p+2)–>就是一个定义
D:(p+1)+2–>(p[0]+1)+2–>p[3] 越界

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

提拉米苏yes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值