C语言总结-----数组

目录

 

一、一维数组

(一)一维数组的引用

(二)一维数组在内存中的存放

(三)一维数组的初始化

二、二维数组

(一)二维数组元素的引用

(二)二维数组的内存映射

(三)二维数组的初始化

(四)补充

三、字符数组

(一)字符串和字符串结束标志

(二)字符数组的输入输出

(三)字符串处理函数

1. puts函数

2. gets函数 (尽量少用,字符串有空格时建议用)

3. strlen函数

4. strcat函数

5. strcpy函数

6. strcmp函数


一、一维数组

  • 一维数组的定义格式为: 类型说明符 数组名[常量表达式]

       例如: int a[10];   它表示定义了一个整形数组,数组名为a,有10个整形元素。

  • 定义数组时,需要指定数组中元素的个数,方括弧中的常量表达式用来表示元素的个数,即数组长度。
  • 常量表达式中可以包括常量和符号常量,但不能包含变量
  • 注意: C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。
  • 常见的错误:

       ① float a[0];           /* 数组大小为0没有意义 */

       ② int b(2)(3); [ ]     /* 不能使用圆括号 */

       ③ int k, a[k];         /* 不能用变量说明数组大小*/  

(一)一维数组的引用

  • 格式为: 数组名[下标]
  • C语言中,数组元素的下标从0开始,而且必须为整型常量或变量。

        int a= 5;      array[a] = 99;  (变量)        array[0], array[1], array[2], array[3], array[4]  (常量)

  • 数组元素本身相当于一个变量,因此,对数组元素的操作类似于对变量操作。

(二)一维数组在内存中的存放

  • 一维数组: int array[6] = {11,22,33,44,55,66,77}
  • 每个数据元素占用的字节数,就是基类型(int 4字节)的字节数,一个元素占4个字节。
  • 系统会为一个数组分配一段连续的存储空间。数组的首地址就是第0个元素的地址。

(三)一维数组的初始化

1.在定义数组时对数组元素赋以初值。 例如:int a[10]={0,1,2,3,4,5,6,7,8,9};

2. 可以只给一部分元素赋值。例如:  int a[10]={0,1,2,3,4};    只给前面5个元素赋初值,后5个元素值为0

3. 数组中全部元素值为0,可以写成: int  a[10]={0,0,0,0,0,0,0,0,0,0};   或int a[10]={0}; 不能写成:int a[10]={0*10};

4. 在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。  

 例如 : int a[5]={1,2,3,4,5};    也可以写成  int a[]={1,2,3,4,5};  

二、二维数组

  • 二维数组定义的一般形式为: 类型说明符  数组名[常量表达式][常量表达式]

      例如:定义a为3×4(3行4列)的数组,b为5×10(5行10列)的数组。

      int  a[3][4],b[5][10] ;

  • 注意:我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。

       例如:可以把a看作是一个一维数组,它有3个元素:a[0]、a[1]、a[2],每个元素又是一个包含4个元素的一维数组。

 

(一)二维数组元素的引用

二维数组元素的引用是以数组名开头然后依次指定数组的下标来引用一个元素。

引用形式为: 数组名[第一维下标] [第二维下标]

例如:a[i][j]引用了二维数组a的第i行第j列元素。

(二)二维数组的内存映射

二维数组在内存中是按照二维数组元素的下标从小到大的顺序来存储的。

即首先存储二维数组第一行元素中的所有元素,然后依次存储接下来的元素

上述的二维数组a在内存中的映射如表所示。 这里假设系统为二维数组a分配的内存首地址为BFD5CACC。

内存首地址(16进制)

数组元素

BFD5CACC

a[0][0]

a[0]

BFD5CAD0

a[0][1]

BFD5CAD4

a[0][2]

BFD5CAD8

a[1][0]

a[1]

BFD5CADC

a[1][1]

BFD5CAE0

a[1][2]

(三)二维数组的初始化

数据类型 : 数组名 [常量表达式1][常量表达式2]={ 初始化数据 };

4种方法对二维数组初始化:

1.分行给二维数组赋初值。 (除去第一个花括号,一个花括号表示一行)

   例如: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

2.可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。

   例如: int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

3.可以对部分元素赋初值。

   例如: int a[3][4]={{1}, {5}, {9}};    //1 0 0 0 5 0 0 0 9 0 0 0 

   也可以对各行中的某一元素赋初值,

   如int a[3][4]={{1}, {0,6}, {0, 0, 0, 11}};   //1 0 0 0 0 6 0 0 0 0 0 11

4.如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省

    例如: int a[3][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};等价于: int a[ ][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

(四)补充

scanf      +  %d时,enter认为前一个输入结束

               + %s时,enter要用getchar()吸收

sizeof + 地址或指针  都是原来定义的字节数不会改变

sizeof + 数组名称    测量整个数组占用的字节

//一维数组
int array1[10];
    printf("sizeof(array1) = %d\n",sizeof(array1));        //40  4*10
//二维数组
int a[3][2];
   printf("sizeof(a) = %d\n",sizeof(a));//24  4*3*2

三、字符数组

例如:char c[10];   c[0]=′I′ ;  c[1]=′ ′;   c[2[=′a′;   c[3]=′m′;   c[4]=′ ′;   c[5]=′h′;  c[6]=′a′;   c[7]=′p′;   c[8]=′p′;   c[9]=′y′;

对字符数组初始化,可逐个字符赋给数组中各元素。 例如: char c[10]={‘I’, ‘ ’,‘a’,‘m’,‘ ’,‘h’,‘a’,‘p’, ‘p’,‘y’} 

(一)字符串和字符串结束标志

为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”——‘\0’。

(二)字符数组的输入输出

字符数组的输入输出可以有两种方法:

  • 逐个字符输入输出。用格式符“%c”输入或输出一个字符。
  • 将整个字符串一次输入或输出。用“%s”格式符,意思是对字符串的输入输出。

说明:

(1)用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。

(2)如果数组长度大于字符串实际长度,也只输出到遇′\0′结束。

(3)输出字符不包括结束符′\0′。

(4)如果一个字符数组中包含一个以上′\0′,则遇第一个′\0′时输出就结束

(5)可以用scanf函数输入一个字符串%s。(在输入时以空格分隔)

例如:scanf(″%s %s %s″,str1,str2,str3);

输入数据:How are you? 数组中未被赋值的元素的值自动置′\0′。

(三)字符串处理函数

1. puts函数

其一般形式为:  puts (字符数组)

其作用是将一个字符串(以′\0′结束的字符序列)输出到终端并加上换行符

假如已定义str是一个字符数组名,且该数组已被初始化为"China"。则执行puts(str);其结果是在终端上输出China。

用puts函数输出的字符串中可以包含转义字符。

例如: char str[]={″China\nBeijing″};

            puts(str);

输出结果: China

                   Beijing      

                  (空行)

在输出时,将字符串结束标志′\0′转换成′\n′, 即输出完字符串后换行。

  

2. gets函数 (尽量少用,字符串有空格时建议用)

其一般形式为:gets(字符数组)  

其作用是从终端输入一个字符串到字符数组。该函数值是字符数组的起始地址。

注:1、gets以回车键表示输入结束,scanf以回车键和空格表示输入结束。如输入的字符中含有空格,则使用gets。

      2、因为gets函数未能指定缓冲区大小,Linux中将提醒warning: the `gets' function is dangerous and should not be used.

以下 的字符串处理函数需要加入头文件#include<string.h>

3. strlen函数

其一般形式为:    strlen (字符数组)

strlen是测试字符串长度的函数。

函数的值为字符串中的实际长度(不包括′\0′在内)。sizeof()则包括'\0'
 

char str[10]={″China″};     

          printf(″%d\n″,strlen(str));   //5

         printf("%d\n", sizeof(str));     //10

4. strcat函数

其一般形式为:strcat(字符数组1,字符数组2)

Strcat的作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中。

函数调用后得到一个函数值——字符数组1的地址。

char c1[20] = "hello";
char c2[10] = "world";
if(strlen(c1) + strlen(c2) < sizeof(c1)
{
    strcat(c1,c2);
    printf("%s\n",c1);  //helloworld
}

5. strcpy函数

其一般形式为:strcpy(字符数组1,字符串2)

strcpy是“字符串复制函数”。 作用:是将字符串2复制到字符数组1中去。

例如: char str1[10],str2[]={″China″};

           strcpy(str1,”china”);

注意:

(1)字符数组1必须定义得足够大,以便容纳被复制的字符串。字符数组1的长度不应小于字符串2的长度。

(2)“字符数组1”必须写成数组名形式(如str1), “字符串2”可以是字符数组名,也可以是一个字符串常量。

        如:strcpy(str1,″China″);

(3)复制时连同字符串后面的′\0′一起复制到字符数组1中。

(4)可以用strcpy函数将字符串2中前面若干个字符复制到字符数组1中去。

        例如:strncpy(str1,str2,2);作用是将str2中前面2个字符复制到str1中去,然后再加一个‘\0’

(5)不能用赋值语句将一个字符串或字符数组直接给另一个字符数组。

如:    str1=″China″;  不合法    

            str1=str2;       不合法

  • 用strcpy函数只能将一个字符串复制到另一个字符数组中去。
  • 用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。
  • 下面是合法的使用:

       char a[5],c1,c2;

       c1=′A′;  c2=′B′; a[0]=′C′;

       a[1]=′h′; a[2]=′i′;

       a[3]=′n′; a[4]=′a′;

6. strcmp函数

其一般形式为:strcmp(字符串1,字符串2)

strcmp的作用是比较字符串1和字符串2。

例如: strcmp(str1,str2);            strcmp(″China″,″Korea″);            strcmp(str1,″Beijing″);

比较的结果由函数值带回

(1) 如果字符串1=字符串2,函数值为0。

(2) 如果字符串1>字符串2,函数值为1。

(3) 如果字符串1<字符串2,函数值为-1。

注意:对两个字符串比较,不能用以下形式:

if(str1>str2)     printf(″yes″);

而只能用

if(strcmp(str1,str2)>0)     printf(″yes″);

猜你喜欢

转载自blog.csdn.net/lishasha5/article/details/83153776