c语言笔记——数组

一个数组元素其实就是一个变量(可以称为带下标的变量。

一、一维数组

1、定义

类型名 数组名[常量表达式]不能放变量

float s[25];
float s[5*5];
int a[10];
char s1[30];
数组名属于用户定义标识符。要遵守 标识符 命名规则
int for[25];不合法
定义一维数组时数组名后必须用一个方括号( [] ),将常量表达式括起来,常量表达式的值表示所定义数组 共有多少个元素(数组长度或数组的大小)。
如:下面定义为非法
int a(10); ,小括号是函数的标志,计算机会认为是函数,函数声明要放形参,但10是实参。
int a{10}; ,花括号是函数体的标志,复合语句的标志,初始化的分隔符
定义数组时方括号中的 表达式不能含有变量 。另外 表达式的 值必须要大于零且为正整数 。如:
int a[1.5] ;
int a[-10];
int a[n];
int a[0];
int N=9; int a[N]; 错 

 #define N 9

int a[N]

2、一维数组元素的引用格式

数组名[下标]
(1)先定义数组后使用
(2)不能整体用数组名
(3)C语言中不能对数组进行整体引用,只能单独引用其中的元素。引用时下标可以是表达式
char a[10];         a[0]-a[9]
a[0]=’A’;            使用,
a[3+7]=’b’;         使用, 错,越界
记住:数组元素的下标值在( 0~N-1 之间)。

 3、 一维数组的初始化

类型名 数组名[常量表达式]={初值1,初值2,…};

(1) 定义 一维数组时 可以将各元素的初始值依次放在 一对{}中赋给数组(必须用{}将初值括起,且初值 之间用一个逗号分隔)。
(2) 多则出错;少则补0
int a[5]={19,45,66,90,100,80}; 出错,越界
(3) 定义赋初值的个数等于数组长度,则数组长度可以省略
int a[ ]={19,45,66,90,100,80}; 自动认为是6
(4) 一个也不给则是随机值。
int a[ ];
int a[5]={11}; 其余为0
int a[5]; 随机值
(5) 只能在定义数组的同时用{}给数组元素整体赋值
a[5]={1,2,3,4,5};

二、二维数组

1、二维数组的定义格式

类型名 数组名 [常量表达式1][常量表达式2];
如:
int a[10][10];十行十列
char b[3][4];三行四列
float s[7][3];七行三列,每个元素为float型
注:
(1) 数组名要遵守用户自定义标识符的命名规则。
(2) 定义二维数组第一个方括号常量表示行数第二个方括号常量表示列数
int a[4*5]; 一维,20个元素
int a[4][5]; 二维,四行五列,20个元素
(3) 定义数组时方括号中的表达式不能含有变量 ,且表达式的值必须是大于0的正整数。
int i=3;
int a[i][4]; 合法? 不合法
(4) 在内存中二维数组元素的存放也是连续的, 先行后列原则

2、二维数组元素的引用

数组名[行下标][列下标]
注:
(1)不能整体引用,只能引用其中的元素
(2) 引用二维数组元素时,必须有行下标和列下标两个下标。从0开始依次加1

3、二维数组的初始化

方法1 将初值依序放在一对{}中,与 一维数组初始化格式相同。
例如: int a[2][3]={1,2,3,4,5,6};
方法2 定义二维数组同时,按行初始化
每一行初值均用一对{}括起, 采用嵌套的{}格式
例如: int a[2][3]={ {1,2,3} , {4,5,6} };
第0行:{1,2,3},1,2,3列
第1行:{4,5,6},1,2,3列
注 意 :
定义二维数组的同时给数组初 始化,则可以省略行数,但列数不能省略
例如: int a[][3]={1,2,3,4,5,6}; 合法,两行
int a[2][]={1,2,3,4,5,6}; 不合法,不能省列
int a[][3]; 不合法,无初值

三、字符数组

C语言中没有字符串变量,那么如何存储?
方法1:字符数组来存放。
方法2:字符型指针变量。

1、字符数组的初始化

与其它类型数组的初始化方式一样,只是其初始值是字符。

char s[]={‘a’,’b’,’c’,’d’,’e’};长度为 5

2、字符串

因为字符串最后都有一个字符串结束符(’\0’), 所以用字符数组来存放字符串时一定要有一个
元素存放结束符’\0’
(1) 字符串常量后有一个’ \0’
如:“ abcd” 5(4+1)个字符 组成,c编译器见到 双引号 \0
“” 等价于”\0” , 是一个空字符串。
(2)用字符串给一字符数组进行初始化有三种情况
方法1:   char a[]=”abcd”; 5(4+1) 双引号出现,花括号才能省
                同
                char a[]={‘a’,’b’,’c’,’d’}; 4
方法2: char a[]={”abcd”}; 合法 5(4+1)
方 法 3 : char a[]={‘a’,’b’,’c’,’d’,’\0’}; 5  自己加了\0,也可以认为是字符串

 四、数组的使用

1、一维数组

例1

 

例2 

 

 

2、二维数组

 

 改进

 如果printf(“\n”); 在花括号外面,所有数字会在一行输出

 3、字符串使用

(1)字符串存储(赋值)四种方法

方法1scanf( );键盘输入
char a[10]; scanf(“%s”,a);
scanf(“%s”,&a); 非法

注:用%s格式输入时,遇到空格符或回车符则自动结束输入

scanf(“%s,%s”,a,b); 不能正确读取数据。

方法1printf( );输出
如: char s[10];
scanf(“%s”,s); 输入: ab cd< 回车 >
printf(“%s”,s); ab (空格以为是\0结束,只输出双引号里面的,\0标志不输出)
注意:输出时则从当前地址开始直到遇到结束符’ \0’ 为止
方法2gets( )键盘输入
格式:# include<stdio.h>
gets( 字符数组 )
功能:读取一个字符串赋给字符数组
注:
(1) 用该函数输入字符时,只有遇到回车符系统才结束读取字符,
如: char str1[10]; gets(str1);
输入: ab cd< 回车 >
str1: ab cd (此时输出空格)
(2) 不论是用 %s 还是 gets() 在输入时均 不需要输入双引号 ,若输入时用了双引号则双引号也作为字符串的有效字符。
方法2puts( )输出
格式:# include<string.h>
puts( 字符数组或字符串常量 )
功能:在屏幕上输出字符数组中的字符。
用该函数输出与用%格式输出一样
只是该函数将 ’\0’转成’\n’ 输出
(1)puts(“abc”);puts(“defg”);
输出结果:
        abc
        defg
(    光标也下一行)
————————————————
(2)printf(“abc”);printf(“defg”)
         abcdefg
方法3:字符串初始化
char s[]=“abcd”; 5
char s[]={“abcd”}; 5
char s[]={‘a’,’b’,’c’,’d’,’\0’} 5
方法4:strcpy()——拷贝

char a[10];

strcpy(a,"abcd")把abcd拷贝到数组名里

但是a=“abcd”是不对的,赋值号左边只能是变量,不能是地址常量

(2)字符串函数

1个函数:strcat()——连接
格式 : #include<string.h>
strcat( 字符数组 1, 字符数组 2)
功能:“连接
        从第一个串'\0'开始连入
        第二个串'\0'也连入
        返回第一个数组首地址
如:
char a[18]=” jack”;
char b[10]=”zhy”;
strcat(a,b);
a=>”jackzhy”
b=>”zhy”      

少则补0,0就是'\0',因为'\0'的ASCII码就是0,它们值相同,形式不同,如果是字符型可以说少则补斜杠0,整型0和字符型0

而‘0’ 是48

2个函数:strcpy()——拷贝
格式 : #include<string.h>
strcpy( 字符数组 1, 字符数组 2)
功能:将字符数组 2 中的字符串替换到字符数组 1 中。函数值为字符 数组1 的首地址
从1第一个字符开始练,把2的'\0'也连进去
如:
char str1[10]=”1234567”,str2[10]=”abc”;
strcpy(str1,str2);
str1=>”abc”
str2=>”abc”
3个函数: strcmp()——比较
格式 : #include<string.h>
strcmp( 字符数组 1, 字符数组 2)
功能:函数返回值相同位置 不同字符 ASCII 码差值
返回的是数值:
                0,两个字符串相等
                大于0,前面字符串大于后面字符串
                小于0,前面字符串小于后面字符串
例:
strcmp( abc , abc );=>0
strcmp(“abc”,”abfc”);=>-3( ‘c’-‘f’=99-102
strcmp(“abc”,”ab”);=>99( ‘c’-‘\0’=99-0

注:不能用关系运算符直接进行字符串大小或字符数组大小的比较(会变成地址的比较)
abc”==”abc”
“abc”>”ab”
4个函数: strlen( )——不算\0
格式 : #include<string.h>
strlen( 字符数组 )
功能:求出字符数组的实际长度(不包括结束符)

char a[10] =”4332567”       
printf(“%d”,strlen(a));         //7        
char a[]=”abc
\018\0”;       //5 

char a[]=”abc\017\0”;      //4

    char a[]=”abc\08\0”;      //3
printf(“%d”,strlen(a));

(3)例题分析

例题1

 例题2

 

 

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值