目录
数组简述
- 数组是构造类型之一
- 数组是具有一定顺序关系的若干个变量的集合,组成数组的各个变量称为数组的元素。
- 数组中个元素的数据类型要求相同,用数组名和下标确定,数组可以是一维的也可以是多维的。
一维数组的定义
- 所谓一维数组是指只有一个下标的数组,它在计算机的内存中是连续存储的。
- C语言中,一维数组的说名一般形式如下:
<存储类型> <数据类型> <数组名> [<表达式>] 例如:int a[6];- 数组名表示内存首地址,是地址常亮,sizeof(数组名)是数组的内存空间。
例:
#include<stdio.h>
int main (void)
{
int a[10];
int i ;
for(i = 0;i<10;i++)
printf("%p\n",&a[i]);
return 0;
}
运行结果:
0x7ffd148f8a20
0x7ffd148f8a24
0x7ffd148f8a28
0x7ffd148f8a2c
0x7ffd148f8a30
0x7ffd148f8a34
0x7ffd148f8a38
0x7ffd148f8a3c
0x7ffd148f8a40
0x7ffd148f8a44
注:程序运行是在linux系统下运行得到的结果,每个人运算得到的结果有可能都会不一致的。
%p是打印地址信息的格式输出控制符
一维数组的初始化
- 初始化方式:在定义数组时,为数组元素赋初值
- int a[5] = {1,2,3,4,5};
- 说明
- 数组不初始化,其元素值为随机数
- 对static数组不赋初值,系统会自动赋以0值
- 只给部分数组元素赋初值
对于第2条:
static int a[5];
等价于:
a[0];a[1] = 0;a[2] = 0;a[3] = 0;a[4] = 0;
例:数组只给部分元素赋初值,剩余元素以0代替
#include<stdio.h>
int main (void)
{
int a[10] = {1,5,6,8};//数组初始化部分元素
int i ;
for(i = 0;i<10;i++)
printf("%p,%d\n",&a[i],a[i]);//打印数组数值
return 0;
}
运行结果:
0x7ffc991407e0,1
0x7ffc991407e4,5
0x7ffc991407e8,6
0x7ffc991407ec,8
0x7ffc991407f0,0
0x7ffc991407f4,0
0x7ffc991407f8,0
0x7ffc991407fc,0
0x7ffc99140800,0
0x7ffc99140804,0
二维数组的定义
- 定义方式:(声明时列数不能省略,行数可以省略)
- 数据类型 数组名[常量表达式][常量表达式]
例如:
int a[3][3];
float b[5][3];
- 数组元素的存放顺序
- 二维数组是按照行序优先进行存储的,因为内存是一维的,所以二维数组需要按照先后顺序进行存储。
例如:int a[2][3]
a[0][1] | a[0][2] | a[0][3] |
a[1][1] | a[1][2] | a[1][3] |
先存储a[0][1],再存储a[0][2]
例:
#include<stdio.h>
int main(void)
{
int a[2][3];
int i,j;
for(i= 0;i<2;i++)
{
for(j = 0;j<3;j++)
printf("%p ",&a[i][j]);//打印数组地址
printf("\n");
}
/*打印数地址以及数组长度*/
printf("%p %ld\n",a,sizeof(a));
/*打印第一行数组地址以及数据数组长度*/
printf("%p %ld\n",a[0],sizeof(a[0]));
/*打印第二行数组地址以及数据数组长度*/
printf("%p %ld\n",a[1],sizeof(a[1]));
return 0;
}
运行结果:
0x7fff263db870 0x7fff263db874 0x7fff263db878
0x7fff263db87c 0x7fff263db880 0x7fff263db884
0x7fff263db870 24
0x7fff263db870 12
0x7fff263db87c 12
二维数组元素的引用
- 形式:数组名[下标][下标]
- 二维数组元素的初始化
- 分行初始化
- 按元素排列顺序初始化
分行初始化
例:int a[2][3]={ {1,2,3},{4,5,6}};
按元素排列顺序初始化
例:int a[2][3]={1,2,3,4,5,6};
多维数组
具有两个或两个以上下标的数组称为多维数组。
例: int a[2][3][4];//是三维数组
三维数组在实际的应用中已经很少了,在此就不再多做介绍。
字符数组和字符串
目标:
- 掌握字符数字的用法
- 掌握字符串的用法
字符数组
字符数组是元素的数据类型为字符类型的数组 char c[10],ch[3][4];
字符数组的初始化
- 逐个字符赋值 char ch[5] = {‘B’,’o’,’y’};
- 用字符串常量char ch[6] = {“hello”};char ch[] = “hello”;
例:
#include<stdio.h>
int main()
{
int i,n,n1;
char ch[] = {'a','b','c'}; //字符
char ch1[6] = {'a','b','c'};//字符串,空余的位数用'\0'表示
n = sizeof(ch)/sizeof(char) //字符串长度
for(i = 0;i < n;i++)
{
putchar(ch[i]);//循环打印字符
}
putchar('\n');
n1 = sizeof(ch)/sizeof(char) //字符串长度
for(i = 0;i < n1;i++)
{
putchar(ch[i]);//打印字符串
}
putchar('\n');
return 0;
}
运行结果:
abc
abc
字符串
C语言中无字符串变量,用字符数组处理字符串
字符串结束标志:’\0’。
例 char str[] = “hello”;
表示字符长度为5,结尾以’\0’结束。
二维字符串数组
字符数组初始化
char fruit[][10] = {"apple","orange","pear","peach","banana"};
- 表示二维数组有5行,10列。
例
#include<stdio.h>
int main(void)
{
char fruit[][10] = {"apple","orange","pear","peach","banana"};
int i,k;
k = sizeof(fruit)/sizeof(fruit[0]);//表示一共有多少行
for(i = 0;i < k;i++)
{
printf("%s\n",fruit[i]);
}
return 0;
}
运行结果:
apple
orange
pear
peach
banana
程序举例:字符串字符逆序
#include<stdio.h>
#include<string.h>
#define N 20
int main(void)
{
char arr[N] = {0};
char temp;
int i = 0,j,n,k;
printf("Plaese input a string!\n");
gets(arr);
n = strlen(arr);
j = n-1;
while(i<j)
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
puts(arr);
return 0;
}
运行结果:
Plaese input a string!
apple
elppa