数组

一维数组

一维数组的形式

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

例子:
int a[n] -------- n在这里为一个常数
此时a[0]-a[n] 的值是不确定的;

一维数组的使用:

类型名 数组名 [数组长度] ={初值表}
也可以在赋值的时候不用定义数组的长度;
int a[6] ={12,34,34,12,3,4}

一维数组的遍历

#include<stdio.h>

int main(){
	int i=0;
	int a[5]={1,2,3,4,5};
	for(; i<5;i++){


		printf("%d\n",a[i]);
		
	}
}

[!Warning] 注意

  1. int a[6] ={1,2,3} 如果知识对前3个元素赋值,其余元素的初值为0;
  2. 如果是static a[5];那么a中的元素的值都为0;
  3. 数组不可越界,数组的首个下标是0;

二维数组

问题提出:例如一个班50个学生,某一门课程使用了一堆数组,现在需要存储一个班级50学生和6门课程,则需要使用二维数组。

int score [50][6];

这里的第一个[] 可以代表有多少行-----
第二个[]代表有多少列-----------

二维数组的使用

二维数组的初始化

1. 按行
	1. int a[3][4] ={{1,2,3,4},{1,2,3,4},{1,2,3,4}}
2. 所有的数据放到一个大括号里面,按数组元素列
	1. int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}
	   数据太多不易检查,容易遗漏
3. 部分元素赋值,其他元素自动为0;
	1. int a[3][4]={{3},{4},{5}};
4. 定义数组,行数可以省略,但是列数不能省略。
	1. int b[2][3]={3,5,7,9,11,13};
	2. int b[][3]={3,5,7,9,11,13};
	3. int b[][3]={{3,5,5},{9,11,13}};
	4. ==错误==
		1. int b[2][]={1,23,3,44,1};

二维数组的遍历

#include<stdio.h>

int main(){
	int i,k;
	int student[2][3]={{1,3,3},{2,3,4}};
	
	for(i=0;i<2;i++){
		printf("第%d行数组是:",i+1);
		for(k=0;k<3;k++){
		
			printf("%d ",student[i][k]);
		}
		//换行,让程序一目了然。
		printf("\n");
	
	}
}

也可以加入用户定义数组元素功能

for(k=0;i<2;k++){
	for(u=0;u<3;u++){
	
		scanf("%d",arr[i][u]);
	}
}

char数组

定义字符数组

int i;
	char arr[10]={'h','e','l','l','w'};
	for(i=0;i<10;i++){
	
		printf("%c\n",arr[i]);
	
	}

定义字符串

字符串使用"" 这样的双引号引起来的,但是字符使用''单引号引起来的。


char arr[11]={"helloworld"};
//注意在定义字符串的时候会在字符串后面添加一个'\0',好让编译器识别出它是一个字符串;
//所以字符串的实际最大定义位数要少一位

字符数组和字符串的区别

  • 字符串使用"" 这样的双引号引起来的,但是字符使用''单引号引起来的。
  • 字符串以'\0'结束,而字符以自己定义的数结束,而且如果在字符串中间写入'\0'那么后面的数在打印字符串时候就会消失。

char数组的使用

char数组和字符串的输出

如果char数组的自定义长度小于等于 N-1则和相同字符char字符串是等价的

#include<stdio.h>

int main(){

	int i=0;
	//下面这两个式子是等价的,因为char如果部分赋值则剩余部分则会默认为'\0' 和char字符串的最后一位一样'\0' 
	char ch1[]="123";
	char ch2[4]={'1','2','3'};
	printf("%s\n",ch1);
	printf("%s",ch2);
	
	return 0;
}


如果char数组的自定义长度占满了定义则用%s输出的时候会出现乱码,这时候就仅仅是字符数组,而不等同于字符串;

//输出用%s,但是这个仅用于字符串,不用于字符数组,但使用字符数组的时候以上情况可能会乱码;
printf("%s",arr);

字符串比较

🤔方法1:利用引用函数比较

#include<stdio.h>
#include<string.h>
int main(){

	char str1[]="123";
	char str2[]="123";
	int flag=strcmp(str1,str2);
	printf("%d",flag);
	//如果-1可能 第二个长度大于第一个长度
	//如果0 两个相等 !!! 主要的作用就是这个
	//如果1 可能第一个长度大于第二个
}

🤔方法2:通过比较两个字符串中的各个元素来判断
这里注意:我在练习的时候在while 或者 if中== 写成了= 然后就没有得到我想要的结果,粗心。

#include<stdio.h>

int main(){

	int i=0;
	char ch1[]="123";
	char ch2[]="123";
	//注意while()中的== 判断 ,我这里之前写成了=
	while(ch1[i]==ch2[i]){
	
		if(ch1[i]=='\0'){
			printf("这两个字符串相同\n");
			return 0;
		}
		i++;
	}
	printf("这两个字符串不相同");
	return 0;
}

字符串的其他操作

字符串输入输出

  1. 使用scanf()和printf() 输入输出
  2. 使用getchar()【输入一个字符】putchar() 【getchar函数,可以从终端接收用户输入的一个字符】输入和输出字符串
    1. getchar()函数机制
      getchar()函数实际上是int getchar(void),所以它返回的是ASCII码,所以只要是ASCII码表里有的字符它都能读取出来。在调用getchar()函数时,编译器会依次读取用户键入缓存区的一个字符(注意这里只读取一个字符,如果缓存区有多个字符,那么将会读取上一次被读取字符的下一个字符),如果缓存区没有用户键入的字符,那么编译器会等待用户键入并回车后再执行下一步 (注意键入后的回车键也算一个字符,输出时直接换行)。
	char b= 'c';
	//char a=getchar();
	//printf("%c",a);
	
	putchar(b);	

注意

1.  # include <stdio.h>
2.  int main(void)
3.  {
4.  int a[5];
5.  a[5] = {1, 2, 3, 4, 5};
6.  return 0;
7.  }
8. 这里a[5]是错误的,这里a[5]已经变成数组的索引了,不是整个数组。
  • C语言不支持动态数组,数组必须在编译时定义长度。【也就是说不能由键盘录入定义数组的长度】
  • 不能为数组名赋值-> arr=50->error;
posted @ 2022-07-13 18:48  Development_UP  阅读(47)  评论(0)    收藏  举报