C_Language_05
C_Language_05
一维数组:
1.数组属于构造类型
2.具有相同数据类型的成员组成的一组数据
3.存储不同类型数据的数组有对应的名称,整型数组:数组中成员变量都是整型的;浮点型数组:数组中成员变量都是浮点型的
4.数组是由多个成员组成,每个成员被称为数组元素
定义数组:
类型修饰符 数组名[常量表达式] = {值1,值2,值3...};
1.类型修饰符:指定数组中元素的类型
2.[]中设定数组元素的个数,即数组的存储空间。只能是常量表达式,不能是变量表达式
3.初始值之间用,隔开
定义一个整型数组,存放3个数组元素 2,3,4
int a[3] = {2, 3, 4};
float a[3] = {2, 3, 4};
printf("%lu\n",sizeof(a));
定义方式:
定义数组的方式1:没有赋初始值单独元素,自动设置初值为0;
int b[5] = {3,4,5};
printf("%lu\n",sizeof(b));
定义数组的方式2:
int c[5] = {0};
定义数组方式3:根据初始化设置,判断数组元素个数
int d[] = {3,4,5,6};
printf("%lu\n",sizeof(d));
错误方式:
定义数组 错误 方式1:指定的数组元素个数 < 设定初值的数量
int e[2] = {3,4,5,6};
printf("%lu\n",sizeof(e));
定义数组 错误 的方式2:既没有指定元素个数,也没有赋初始值
int f[] ={0};//不是给第一个元素赋值0 ?
printf("%lu\n",sizeof(f));
定义数组后,数组的存储空间是连续的
数组的存储空间 = 数组元素的个数 * 元素占的字节
访问数组元素:
1.不能一次整体调用整个数组的全部元素的值,基本数据类型变量只存储一个数据。
数据中存储多个数据,不能通过数组变量调用所有的元素。
2.访问数组元素 使用下标实现 数组名[下标]
3.下标:数组元素在数组中的序号,数组中的元素是有序的,每个元素都有序号,
序号从0开始递增,最后一个元素的序号是n-1,n表示数组元素的个数
4.下标的范围:0~n-1
5.下标可以用整型常量或变量表示
遍历数组:
1,按照顺序:从数组的第一个元素开始,访问数组的最后一个元素结束
2,使用for循环实现的数组遍历
3,循环和数组关系密切
示例:
int age[5] = {18,15,33,19,25};
printf("%d\n",age[0]);
// 用for遍历
for (int i = 0; i < 5; i ++)
{
printf("age[%d] = %d\n",i,age[i]);
}
// 反向遍历
for (int i = 4; i >= 0; i --)
{
printf("age[%d] = %d\n",i,age[i]);
}
修改数组元素:根据数组下标确定需要修改的数组元素
int aa[] = {1,2,3,4,5};
//遍历数组
for(int i = 0; i < 5;i ++)
{
printf("aa[%d] =%d \n",i,aa[i]);
}
printf("========\n");
//修改数组元素
aa[1] = 22;
aa[4] = 44;
// 再遍历
for(int i = 0;i < 5;i ++)
{
printf("aa[%d] = %d \n",i,aa[i]);
}
通过循环方式给数组元素赋值:
1,定义一个数组,必须设置数组元素数量,数组元素初值为0
2,通过循环给元素赋值
示例:
int num[5] = {0};
//在0~10之间取随机数,分别赋给每个元素
for (int i = 0; i < 5; i ++)
{
num[i] = arc4random()%(10 - 0 + 1) + 0;
printf("%d ",num[i]);
}
示例:定义一个具有10个元素的数组,每个元素的值在30~80之间取随机数
int number[10] = {0};
for (int i = 0; i < 10; i ++)
{
number[i] = arc4random()%(80 - 30 + 1) + 30;
printf("number[%d] = %d\n",i,number[i]);
}
printf("\n");
示例:定义一个具有20个元素的整型数组,每个元素的取值都是30~70.并求数组元素的和
int number[20] = {0},sum = 0;
for (int i = 0; i < 20; i ++)
{
number[i] = arc4random()%(70 - 30 + 1) + 30;
printf("number[%d] = %d\n",i,number[i]);
sum += number[i];
}
printf("20个数的和是%d\n",sum);
越界:使用数组下标时超出数组范围,即访问了不属于数组的存储空间,编译器不会检测数组下标是否越界,因此操作数组时必须保证没有越界
int Crazy[4] = {2,3,4,5};
printf("%d",Crazy[4]);
注意事项:
定义数组:类型 数组名[元素个数]
数组元素:数组名 [数组下标]
数组作为一个整体不能直接参与运算
示例:把数组a中的元素赋值给数组b中
int a[5] = {1,2,3,4,5};
int b[5] = {0};
for (int i = 0; i < 5; i++)
{
b[i] = a[i];
printf("b[%d] = %d\n",i,b[i]);
}
printf("反向遍历\n");
for (int i =4; i >= 0 ; i--)
{
b[i] = a[i];
printf("b[%d] = %d\n",i,b[i]);
}
示例:生成两个数组每个数组都有10元素,元素取值范围在20~40之间,数组对应元素相加,放到另外一个数组中
int a[10] = {0},b[10] = {0},c[10] = {0};
for (int i = 0; i < 10; i ++)
{
a[i] = arc4random()%(40 - 20 + 1) + 20;
printf("a[%d] = %d ",i,a[i]);
}
printf("\n");
for (int i = 0;i < 10; i ++)
{
b[i] = arc4random()%(40 - 20 + 1) + 20;
printf("b[%d] = %d ",i,b[i]);
}
printf("\n");
for (int i = 0; i < 10; i ++)
{
c[i] = a[i] + b[i];
printf("c[%d] = %d ",i,c[i]);
}
printf("\n");
数组排序:
1.常见的排序方法:冒泡排序、选择排序、插入排序等
2.排序的规则有两种:升序、降序
3.重点:冒泡排序
4.冒泡排序的思路:每次将相邻的两个数进行比较,按照升序或降序进行交换,直到所有数字的顺序正确为止。
示例:
int a[5] ={5,4,3,2,1};
// 外循环,控制循环的排序趟数,趟数:4
for (int i = 0; i < 5-1; i++) {
// 内循环,控制比较次数
// 5 4 3 2 1
// 4 3 2 1 5
// 3 2 1 4 5
// 2 1 3 4 5
// 1 2 3 4 5
// 1 2 3 4 5
for (int j = 0; j < 5 - i - 1; j++) {
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] =a[j+1];
a[j+1] = temp;
}
}
for (int i = 0; i < 5; i++) {
printf("%d ",a[i]);
}printf("\n");
}
字符数组:
1.数组元素存储的时字符
定义字符数组
char a[5] = {'h','e','l','l','o'};
char b[] = {'h','e','l','l','o'};
char c[10] = {'h','e','l','l','o'};
a[3] = 't';//修改
printf("%c\n",a[3]);//访问
printf("%c\n",b[3]);
printf("%c\n",c[3]);
字符串:
char a2[] = "hello";
printf("%s\n",a2);
char a3[] = {'h','e','l','l','o','\0'};
printf("%s\n",a3);
1.字符串常量“hello”
2.使用字符数组存储字符串
3.使用%s,输出字符串
定义字符数组存储字符串:
1.char a2[] = "hello";
系统如何识别字符串:'\0'。数据存储在内存中,系统如何识别哪些字符属于一个完整的字符串, '\0'是字符结束的标志,在字符串的最后一位,由系统默认添加,不会显示
“hello”存储时,实际上是:'h','e','l','l','o','\0'
有效字符:在字符串中,’\0‘之前的字符
字符数组a2中存储字符串:数组元素为'h','e','l','l','o','\0'
存储字符串的字符数组元素个数:有效字符个数 +1
输出字符串:printf("%s",a2);
字符串和字符数组的关系:
1.字符串是一个字符数组
char p[] = "hello";
char q[6] = {'h','e','l','l','o'};
char q[] = "hello";
printf("%s\n",q);
p、q都是数组
两个数组存储的内容都是 字符串hello
都可以访问\修改数组元素,遍历
for (int i = 0; i < sizeof(p)/sizeof(char); i++) {
printf("%c",p[i]);
}
2.字符数组不一定是字符串,但是字符串一定是字符数组
3.存储字符串的数组,可以输出单个字符,也可以使用%s输出完整字符串,使用%s输出时,遇到'\0'时结束
char a3[] = {'w','o','r','d','\0'};
printf("%s",a3);
4.字符数组只是存储字符的数组,只能输出单个字符
char a4[] = {'w','o','r','d','\0'};
for (int i = 0; i < sizeof(a4)/sizeof(char); i++) {
printf("+++++%c",a4[i]);
}
printf("\n");
printf("-----%s",a4);//输出结果可能出问题,因为不知什么时候才能读到‘\0’
printf("\n");
字符串操作函数:
1.strlen 测量字符串的长度,不包含'\0'。
// strlen(name)+1=sizeof(name)/sizeof(char)
char name[] = "yujingnian";
printf("%s的长度:%lu\n",name,strlen(name));
2.strcpy 字符串拷贝
字符串2可以是常量、字符数组名
字符数组1的存储空间 >= 字符数组2 注意'\0'
***牢记:把一个字符数组的值给另外一个字符数组,只能用strcpy函数,不能直接对一个字符数组赋值
char a12[4] = {0};// ?
char b12[] = "lanou";
strcpy(a12, b12);//将b12复制到a12
printf("%s\n",a12);
printf("%s\n",b12);
3.strcat 字符串拼接
字符串2拼接到字符串1后,结果保留在字符串1中
字符数组2可以是常量
字符数组1的空间必须足够大
拼接之后,字符串1后面的'\0'取消,只在新的字符后面保留'\0'
char a10[] = "fan",a11[] = "douhong";
strcat(a10, a11);
printf("%s\n",a10);
4.strcmp 字符串比较
char a10[] = "fan",a11[] = "douhong";
// 将两个字符串自左向右比较(按ASCLL码大小比较),直到出现不同的字符或是遇到'\0'为止
// 字符串1的字符 - 字符串2的字符
// 字符串1 = 字符串2,则函数结果为0
// 字符串1 > 字符串2,则函数结果为正整数
// 字符串1 < 字符串2,则函数结果为负整数
printf("%d\n",strcmp(a10, a11));
示例:
查找字符串中的空格:例如:“I love ios,i want iphone6sp”
char str[] = "I love ios,i want iphone6sp";
int nn = 0;
int count = 0;
while (str[nn] != '\0') {
if (str[nn] == ' ') {
count++;
}
nn++;
}
printf("空格数有%d个\n",count);
一维数组:
char a[3] = {"one"};
for (int i = 0; i < 3; i++) {
printf("%c",a[i]);
printf("\n");
}
二维数组:
char a[3][5] = {"one","tow","three"};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 5; j++) {
printf("%c",a[i][j]);
}
printf("\n");
}

浙公网安备 33010602011771号