数组和指针——数组

本文介绍了数组的基本概念,包括元素类型、数组声明和下标访问。重点讲解了C99中的指定初始化器,演示了初始化数组的不同方法,如花括号初始化、for循环和指定初始化。同时,讨论了常见数组赋值误区,并列举了数组大小限制实例。
摘要由CSDN通过智能技术生成

数组


什么是数组?

数组由数据类型相同的一系列元素组成。需要使用数组时,通过声明数组告诉编译器数组中内含多少元素和这些元素的类型。编译器根据这些信息正确地创建数组。普通变量可以使用的类型,数组元素都可以用。考虑下面的数组声明:

/* 一些数组声明 */
int main(void){
    float one[365];       //内含365个float类型元素的数组
    char code[12];        //内含12个char类型的数组
    int two[50];          //内含50个int类型的数组
    double three[30];     //内含30个double类型元素的数组
    /*..........*/
}

若要访问数组中的元素,通过使用数组下标数(也叫做索引)表示数组中的各个元素

初始化数组

1.花括号初始化法

#include "stdio.h"
#define months 12
int main(){
   int days[months]={31,28,31,30,31,30,31,31,30,31,30,31};
   int index;
   for(index=0;index<months;index++)
        printf("\n month %2d has %2d days.",index+1,days[index]);
   return 520;
}

当然这个程序还不够完善,它所表示的只是平年每个月的天数,至于程序的完善希望读者可以拿来练手这种初始化方法。

for循环初始化

#include "stdio.h"
#define months 12
int main(){
   int days[months];
   int index;
   for(index=0;index<months;index++){
        printf("\n please input the %dth number(int):",index+1);
        scanf("%d",&days[index]);
   }
   //初始化完成
   for(index=0;index<months;index++)
        printf("\n month %2d has %2d days.",index+1,days[index]);
   return 520;
}

当然这个程序中也会有许多小瑕疵,比如用户输入的内容万一不是整数类型怎么办,这时请大家看我的另一篇文章,讲述如何实现scanf的优化。https://blog.csdn.net/qq_42392049/article/details/112604480

指定初始化器(C99)

C99增加了一个新特性:指定初始化器( designated initializer)。 利用该特性可以初始化指定的数组元素。例如,只初始化数组中的最后一个元素。对于传统的C初始化语法,必须初始化最后一个元素之前的所有元素,才能初始化它:

     int arr[6] = {0,0,0,0,0,212}; // 传统的语法

而C99规定,可以在初始化列表中使用带方括号的下标指明待初始化的元素:

int arr[6] = {[5] = 212}; //把arr[5]初始化为212

对于一般的初始化,在初始化-一个元素后,未初始化的元素都会被设置为0。

代码实例:

#include <stdio.h>
#define months 12
int main(){
   int days[months]={31,28,[4]=31,30};
   int i;
   for(i=0;i<months;i++)
       printf("\n %2d   %d",i+1,days[i]);
   return 0;
}

该程序在支持C99编译器中输出如下:
1 31
2 28
3 30
4 0
5 31
6 0
7 0
8 0
9 0
10 0
11 0
12 0

给数组元素赋值

这里我们着重看几个常见的错误赋值

#define size 5
int main(){
    int oxen[size] ={5,3,2,9};     /*初始化没问题*/
    int yaks[size];
    yaks=oxen;        /*不允许*/
    yaks[size]=oxen[size];     /*数组下标越界*/
    yaks[size]={5,3,2,8};     /*不起作用*/
}

这些错误是因为C不允许把数组作为一个单元赋给另一个数组,除初始化以外也不允许使用花括号列表的形式赋值。

指定数组的大小

int n=5;
int m=8;
float al[5];                    //可以
float a2[5*2+1]                 //可以
float a3[sizeof(int)+1];        //可以
float a4[-4]                    //不可以 数组大小必须大于0
float a5[0];                    //不可以
float a6[2.5];                  //不可以
float a7[(int)2.5]              //可以
float a8[n];                    //C99之前不允许;

过两天来更新多维数组的知识总结。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值