数组和指针——数组

数组


什么是数组?

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

/* 一些数组声明 */
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之前不允许;

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

猜你喜欢

转载自blog.csdn.net/qq_42392049/article/details/112604218
今日推荐