C语言编程基础--数组

int age1 = 20;

int age2 = 21;

int age3 = 23;

 ......

管理多个同类信息,----->数组

 

数组是由数据类型一致的元素构成的

一:数组的定义:

1) 数据存储  数据类型   数组名 [ 元素的总数 ]  

int        arr [ 10 ]; 

 定义一个由10int类型的数据组成的数组变量;

 如果是局部变量的话,初始值为随机数;

 全局变量的话,初始值是全0

 数组变量对应的数组名就是arr

 

2) 数据存储  数据类型   数组名 [ 元素的总数 ] = { 元素初始值   }

int        arr [ 10 ] ={11,22,33,44,55,66,77,88,99,100}; 

定义一个由10int类型的数据组成的数组变量,数组里面的元素一次性被赋上了初始值

只有在定义数组的时候,才能一次性为所有元素赋值

 

int        arr [ 10 ] ={11,22,33,44,55,66,77 };

等价于 {11,22,33,44,55,66,77 0 0 0};

只要在定义的时候有为部分元素赋值,其它元素的值会被自动赋为0

   int        arr [ 10 ] ={0 }

等价于100;

 

3) 数据存储  数据类型   数组名 [  ]  ={   元素初始值    } 

         定义时缺省元素个数,由系统自动根据所赋的初值来计算出元素个数

               int   arr [  ] = { 11,22,33,44,55};

                       等价于定义一个由5int类型的数据组成的数组变量,

                               int   arr [ 5 ] = { 11,22,33,44,55};
                    int   arr [   ] ;注意这个写法是不可以,因为这个数组没有实际元素个数


二:数组的使用

1) 使用数组的下标来访问对应的元素   arr[i]

          非数组定义时,数组名[i] 这里的是i表示对应的下标从0开始计算的

           N个元素的数组,下标的有效范围{0 ~  N-1}

 

      int  arr [ 5 ] = { 11,22,33,44,55}; // 定义

    11  -----> arr[0]

    22  -----> arr[1]

    33  -----> arr[2]

    44  -----> arr[3]

    55  -----> arr[4]

    arr[5]  数组下标越界,编译的时候不会报错,

    但是不确定后果

    如果希望修改数组里全部元素的值,不可以再一次性赋值了

    arr [ 5 ] = {100 ,101,102,103,104}

    只能逐个元素进行赋值

    数组和for循环是个绝配

      for(i=0 ; i<5 ; i++ ) // 通过i 的值得变化,访问数组中的元素

     {

        //i{0...4}

        arr[i] = 100+i;

    }

 

2) 使用数组名  arr

     int arr[5] ; // 首元素是arr[0]

     数组名就是arr 在通常情况下表示的是数组中的首元素的地址

    arr ====&arr[0]

    只有和以下两个运算符组合在一起的时候例外

   sizeof ( arr )  ---- 表示整个数组的占用空间字节数

   &arr         ---- 整个数组的地址

 

如:  int  arr[ ] = {11,22,33};

  int  min;

  min= arr[0]

  for(i=0; i< sizeof(arr) / sizeof(arr[0])  ; i++) 

// 数组占用字节数/某元素的字节数  ==》元素的个数

 

 

三:可变数组

     在编译程序的时候,还不知道数组的元素个数,但是是确定数组类型和数组名,此时不能给可变数组赋初值;

     直到程序运行到代码定义数组的语句之前,元素的个数才被确定下来

         int length ;

         scanf("%d",&length);   在运行到可变数组定义前,必须得到数组的元素个数

         int array[length] ;//order~  

四:字符数组

  char 类型的数据组成的数组

  char arr[10] ;

  char arr[10] = “hello”;

  char arr[10] = {‘h’, ’e’, ’l’, ’l’, ’o’, ‘\0’ , 0, 0, 0, 0} ;

  char array[10] = {‘h’, ’e’, ’l’, ’l’, ’o’, ‘a’ , ‘b’, ‘c’, ‘d’, ‘e’} ; // 定义是没有问题的,

这个array不适合当成字符串来做操作了,一般是逐个元素的访问

                  {1,2,3,4,5,6,7,8,9,10};

‘\0’是“”自带的,通常我们需要对字符数组进行整体操作的时候,会用上’\0’

我们通常习惯字符串后面的自带’\0’

 

    char a[  ] = “hello” ;  这个字符数组一共占用了6  ‘h’, ’e’, ’l’, ’l’, ’o’, ‘\0’

 char a[ ] = {‘h’, ’e’, ’l’, ’l’, ’o’} ;   这个字符数组一共占用了5

练习:使用键盘给字符数组赋值%s,且把每个字符数组的元素都用%c逐个打印出来,

需要用空格隔开

                   char  arr[100]; // random

                   inti;

                   scanf("%s", arr) ;//scanf("%s", &arr[0])

//      for(i=0; i<100 ; i++)

         for(i=0; arr[i]!='\0' ;i++)// 类似%s  只要在内存中遇到了’\0’就停止打印

         {

                   printf("%c",arr[i]); // 只会显示有效字符

         }

  

scanf("%s" , arr);

               等价于scanf("%s" , &arr[0]);

                把键盘缓冲区中的字符依次放在数组arr的首元素开始的空间,

直到遇到空格或者换行符停止,同时增加一个"\0"

                如果要输入带空格的字符串,可以用scanf(“%[^\n]”,  arr);

或者是  fgets(arr , 100 , stdin);

                             

scanf("%c", &arr[0]);

               只是放置一个字符到首元素地址

 

printf("%s" , arr);

等价于printf("%s" , &arr[0]);

    从地址&arr[0]开始逐个取字符并打印,遇到了‘\0’就停止打印

 

printf("%c", arr[i])

打印对应的一个字符

 

sizeof(arr)  表示整个数组的占用空间字节数

strlen(arr)  函数,可以返回数组的有效字符数,也就是基于arr到‘\0’为止

 

练习:从键盘输入一个可变长度字符串,统计这个字符串中小写字母的个数

且把每个小写字母都打印出来

参考var_array.c 定义可变长度字符串

char_array3.c

******************

字符数组  %c通过下标逐个操作元素, 

%s是访问数组名,基于首元素地址开始操作数组

******************

错误~

char_array3.c:13:9: warning: format %s expects argumentof type char *, but argument 2has type int * [-Wformat=]

%s’这个格式需要的类型是char *(char类型数据的地址),但是第二个参数是int类型数据的地址



猜你喜欢

转载自blog.csdn.net/smallnewbirdbird/article/details/80626106