07数组

本文详细介绍了C语言中的数组,包括定义、特点、一维数组、二维数组和字符数组的相关知识。内容涵盖数组的内存存放、引用、初始化,以及字符数组的输入输出和字符串处理函数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组

定义

数组是一组有序数据的集合。

特点
  • 用一个数组名和下标唯一确定数组中的元素。
  • 数组中的每一个元素都属于同一个数据类型。
分类
一维数组
1定义

要使用数组,必须在程序中先定义数组。

定义一维数组的一般形式为:类型符 数组名[常量表达式]。例如:

int a[10];
//意义:定义了一个数组名为a的数组,数组长度为10,其中每一个数据类型都是整型

常见错误:

float a[0];//数组大小为0无意义
int k, a[k];//不能用变量说明数组大小
int b(2)(3);//不能使用圆括号
2在内存中的存放

zaineicunzhongdecunfang

3引用

引用数组元素的表示形式为:数组名[下标]

a[0] = a[5] + a[7] - a[2 * 3];//合法
int n = 5,a[10];
a[n] =20;//合法

例题:对10个数组元素依次赋值为0,1, 2,3,4,5,6,7,8,9,要求按逆序输出。

#include<stdio.h>

int main(void)
{
    int a[10];
    for(i = 0; i < 10; i++)
    {
        a[i] = i;
    }
    for(i = 9; i >= 0; i--)
    {
        printf("%d",a[i]);
        printf("\n");
    } 
    return 0;
}
4初始化

在定义数组的同时,给各数组元素赋值。

int a[3] ={0,1,2};
int b[10] = {0,1,2,3,4}
//相当于
int b[10] = {0,1,2,3,4,,0,0,0,0,0};
int a[10]={0,0,0,0,0,0,0,0,0,0};
//相当于
int a[10] = {0};
int a[5] = {1,2,3,4,5};
//可写为
int a[] = {1,2,3,4,5};
二维数组
1定义

二维数组可以被看作一个特殊的一维数组:它的元素又是一个一维数组。二维数组常称为矩阵。

类型符 数组名[常量表达式][常量表达式];

float a[3][4];
//定义了一个float型的二维数组,第一维有3个元素,第2维有6个元素。
2在内存中存放

C语言中,二维数组中元素排列的顺序是按行存放的,即在内存中先顺序存放第1行的元素,接着存放第2行的元素。

如图表示a[3][4]数组存放的顺序

erweishuzucunfang

⚠注意:用矩阵形式(如3行4列形式)表示二维数组,是逻辑上的概念,能形象地表示出行列关系。而在内存中,各元素是连续存放的,不是二维的,是线性的。

3引用

形式:数组名[下标][下标]

4初始化
int a[3][4] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} };
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}
int a[3][4]={{1},{5},{9}};
//等价于
int a[3][4] = { {1,0,0,0}, {5,0,0,0}, {9,0,0,0}};
int a[3][4] = { {1}, {5,6}};
//相当于
int a[3][4] = { {1}, {5,6}, {0}};
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};
int a[][4]={{0,0,3},{ },{0,10}};//合法
字符数组
1定义

定义字符数组的方法与定义数值型数组的方法类似。

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';

由于字符型数据是以整数形式(ASCLL码)存放的,因此也可以用整型数组来存放字符数据。

int c[10];
c[0] = 'a';//合法,但浪费存储空间

zifushuzucunfang

2初始化
char c[10]={’I’,’ ’,’a’,’m’,’ ’,’h’,’a’,’p’,’p’,’y’};
char diamond[5][5]={
    {'', '', '*'},
    {'', '*', '', '*'},
    {'*', '', '','','*'},
    {'', '*','','','*'},
    {'','','*'}
};
  • 如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。
  • 如果花括号中提供的初值个数(即字符个数)大于数组长度,则语法错误。
  • 如果初值个数小于数组长度,则只将这些字符赋予数组前面那些元素,其余的元素自动定为空字符(即’\0’)如:
 char c[10]={’c’,’ ’,’p’,’r’,’o’,’g’,’r’,’a’,’m’};

zifu

  • 如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。
 char c[]={’c’,’ ’,’p’,’r’,’o’,’g’,’r’,’a’,’m’};
3引用

输出一个已知的字符串

#include <stdio.h>
int main()
 { char c[15]={ 'I',' ','a','m','','a','','s','t','u','d','e','n','t','.'};
    int i;
    for(i=0;i<15;i++)
        printf("%c",c[i]);
    printf("\n");
    return 0;
} 

lizi

输出一个菱形图

#include <stdio.h>
int main()
{ char diamond[][5]={{' ',' ','*'},
              {' ','*',' ','*'},
              {'*',' ',' ',' ','*'},
              {' ','*',' ','*'},
              {' ',' ','*'}};
  int i,j;
  for (i=0;i<5;i++)
    {for (j=0;j<5;j++)
         printf("%c",diamond[i][j]);
     printf("\n");
    }
  return 0;
}

lingxing

4字符串和字符串结束标志

在c语言中,是将字符串作为字符数组来处理的,关心的是字符串的有效长度,而不是字符数组的长度。为了测定字符串的实际长度,C语言规定了字符串结束标志'\0'

’\0’代表ASCII码为0的字符

从ASCII码表可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做。用它作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志

char c[]={"I  am  happy"};
//可写成
char c[] = "I am happy";
//相当于
char c[11] = {"I am happy"};
char c[10] = {"China"};
//可写成
char c[10] = "China";//从c5开始,元素值均为\0
5字符数组的输入输出

两个方法:

  1. 逐个字符输入输出(%c)
  2. 整个字符依次输入输出(%s)【意思是对字符串string的输入输出】

输出:

char c[] = {"China"};
printf("%s\n",c);

在内存中数组c的存储情况为:
lizi2

输出时,遇结束符'\0'就停止输出。输出结果为China

⚠注意:

  1. 输出的字符中不包括结束符\0

  2. 用“%s"格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。写成下面这样是不对的:

    printf("%s", c[0]);
    
  3. 如果数组长度大于字符串的实际长度,也只输出到遇'\0'结束,例如:

    char c[10] = {"China"};//字符串长度为5,连\0共占6个字节
    printf("%s",c);
    

    只输出字符串的有效字符”China“,而不是输出10个字符。这就是用字符串结束标志的好处。

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

输入:

可以用scanf函数输入一个字符串。例如:

scanf("%s",c);

scanf函数中的输入项c是已定义的字符数组名,输入的字符串应短于已定义的字符数组的长度。

例如:

  • 已定义:char c[6]
  • 从键盘输入:China
  • 系统会自动在China后面加一个\0结束符。

如果利用一个scanf函数输入多个字符串,则应在输入时以空格分隔。例如:

char str1[5], str2[5], str3[5];
scanf("%s %s %s",str1, str2, str3);

输入How are you?

由于有空格字符分隔,作为3个字符串输入。在输入完之后,str1,str2和str3数组的状态如下:

lizi3

数组中未被赋值的元素的值自动置’\0’。

⚠注意:scanf函数中的输入项如果是字符数组名,不要再加地址符&,因为在C语言中,数组名代表该数组的起始地址。

//数组名为c
printf("%0",c);//用八进制形式输出数组c的起始地址
6使用字符串处理函数

使用字符串函数时,在程序开头用#include <string.h>

1.puts函数——输出字符串的函数

形式:puts(字符数组)

作用:将一个字符串输出到终端

char str[20] ="China";
puts(str);

⚠用puts函数只能输出一个字符串,不能写成

puts(str1, str2)

2.gets函数——输入字符串的函数

形式:gets(字符数组)

作用:输入一个字符串到字符数组

gets(str);

从键盘输入:Computer

将输入的字符串”Computer“送给字符数组str(请注意,送给数组的9个字符,而不是8个字符),返回的函数值是字符数组str的起始地址。一般利用gets函数的目的是向字符数组输入一个字符串,而不关心其函数值。

⚠用puts函数只能输出一个字符串,不能写成

gets(str1, str2)

3.strcat函数——字符串连接函数

形式:strcat(字符数组1,字符数组2)

strcat是STRing CATenate(字符串连接)的缩写。

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

char str1[30]=”People”;
char str2[]=”China”;
printf(%s”, strcat(str1,str2)); 
//输出:PeopleChina

4.strcpy函数和strncpy函数——字符串复制

形式:strcpy(字符数组1,字符串2)

作用:将字符串2复制到字符数组1中去

char str1[10], str2[]="China";
strcpy(str1, str2);//相当于 strcpy(str1,"China");

形式:strncpy(str1,str2,2);

作用:将str2中最前面2个字符复制到str1中,取代str1中原有的最前面2个字符

复制的字符个数n不应多于str1中原有的字符

char str1[10],str2[]=”China”;
strcpy(str1,str2);

5.strcmp函数——字符串比较函数

形式:strcmp(字符串1,字符串2)

作用:将两个字符串自左至右逐个字符相比(按ASCLL码值大小比较),直到出现不同的字符或遇到’\0’为止。如全部字符相同,认为两个字符串相等。若出现不相同的字符,则以第一对不相同的字符的比较结果为准。

例如:

  • ”A”<”B”

  • ”a”>”A”

  • ”computer”>”compare”

  • ”these”>”that” ”1A”>”$20”

  • ”CHINA”>”CANADA”

  • ”DOG”<”cat”

  • ”Tsinghua”>”TSINGHUA”

比较的结果由函数值带回:

  • 如果字符串1=字符串2,则函数值为0
  • 如果字符串1>字符串2,则函数值为一个正整数
  • 如果字符串1<字符串2,则函数值为一个负整数
if(str1>str2)
    printf(”yes”); // 错误

if( strcmp( str1,str2 ) > 0)
      printf(”yes”);   // 正确

6.strlen函数——测字符串长度的函数

形式:strlen (字符数组)

作用:测试字符串长度的函数

char str[10]=”China”;
printf(%d”,strlen(str));//5

//直接测试:
strlen("China");

7.strlwr函数——转换为小写的函数

形式:strlwr (字符串)

作用:将字符串中大写字母换成小写字母

8.trupr函数----转换为大写的函数

形式:strupr (字符串)

作用:将字符串中小写字母换成大写字母

`c
if(str1>str2)
printf(”yes”); // 错误

if( strcmp( str1,str2 ) > 0)
printf(”yes”); // 正确


6.<font color="blue">**strlen函数——测字符串长度的函数**</font>

形式:strlen (字符数组)

作用:测试字符串长度的函数

```c
char str[10]=”China”;
printf(”%d”,strlen(str));//5

//直接测试:
strlen("China");

7.strlwr函数——转换为小写的函数

形式:strlwr (字符串)

作用:将字符串中大写字母换成小写字母

8.trupr函数----转换为大写的函数

形式:strupr (字符串)

作用:将字符串中小写字母换成大写字母

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值