C基础5--数组和字符串

数组

【1】一维数组

    0.数组类型 是 由多个元素的组合。
    	这多个元素的数据类型必须完全一样。
	1.数组是一个构造类型,也是最基础的构造类型了。
	
	
	2.数组的个数如下
		char a[5];  char 是所有元素的数据类型。全部都是char
		a是数组名,a是常量(但是不能执行a++/a--/++a/--a)
		[5]   数组有五个成员,分别是:
		a[0] a[1] a[2] a[3] a[4]
		
	//2020-8-27 上次听别人讲,数组也可以认为是指针,
	//因为他代表的也是地址,但是他不可以像指针一样进行加减的操作。
		
	3.数组在内存上是连续的.
	4.数组不会对越界进行检查
      a[5] = 10;    
      /*编译器不会包错误,但是内存已经越界了
      (  因为char a[5]  最大是a[4])
      这个在《C陷阱与缺陷》讲解的比较清晰
	*/
	5.数组名就是数组的首地址
	(这个很类似指针,所以有时候,也讲 数组是指针)  
	6.a+1    &a+1    &a[0]+1 移动的为对应类型的大小。

	数组赋值:
		1.定义时候赋值
			int a[5] = {1,2,3,4,5};  
			int a[5] = {1,2,};
			int a[5] = {0};  
			int a[] = {1,2,3,4,5}; 
			//数组大小根据初始化的元素的个数决定
			
		2.先定义后赋值
			int a[5];
			for(i=0; i<5; i++){
				a[i] = i;
			}  
			
	遍历:    
		for(i=0; i<sizeof(a)/sizeof(a[0]); i++){
			printf("a[%d] = %d,&a[%d] = %p\n",i,a[i],i,&a[i]);
			printf("a = %d\n",a[i]);
				}
	练习:
		1.从终端上输入10元素,将这十个元素排序(冒泡)
			输入:10 30 1 5 34 4 8 16 100 25
	        输出:1 4 5 8 10 16 25 30 34 100		
	
		冒泡排序:
			拿相邻的两个元素进行比较,如果前面的元素大于后面的
			元素,让这两个元素进行交换位置,否则不交换。
				
		2.快速排序(对冒泡排序的优化)
			原理(个人):以第一个数作为轴线,从右向左比较如果后者小就二者交换,如果遇到
			交换就变换方向,从左向右比较,如果左侧值大于轴线值则交换,并在此改变比较方向。
			第一轮比较的结果为轴线左边的全部小于轴线值,轴线右边的全部大于轴线值。然后递归
			再从左侧选出轴线,从右侧选出轴线,依次比较即可。
			1.选择轴值,一般是选取第一个元素的关键码。有一个快排的最坏情况就是如果待
			排序元素是正序或者逆序,就会将除轴值以外的元素分到轴值的一边。 
			2.划分 
			①、设置划分区间:i=first,j=end 
			②、执行右侧扫描,直到r[j]小于轴值,将r[j]与r[i]交换,i++ 
			③、执行左侧扫描,直到r[i]大于轴值,将r[i]与r[j]交换,j– 
			④、重复二到三直到i=j,确定看轴值的所在位置,返回该位置
	注意:
		1.数组名是常量 杜绝a++; 可以a+1
		2.数组不会对越界检查
		
	练习:
		1.从终端上输入10元素,将这十个元素排序(冒泡)
			输入:10 30 1 5 34 4 8 16 100 25		          									
	        输出:1 4 5 8 10 16 25 30 34 100
			
		冒泡排序:
			拿相邻的两个元素进行比较,如果前面的元素大于后面的
			元素,让这两个元素进行交换位置,否则不交换。
		
			int i,j;
			i 比较的趟数  N - 1;
			j 同一趟内比较的次数  N - 1 - i
			
		2.使用选择排序
			每次从数组中取出第一个元素和后面每一个元素进行比较,
			循环一次后找到最小数的下标,然后循环一轮后进行数值的
			交换,直到所有的数都被遍历一遍。
			int i,j;
			i 比较的趟数  N - 1;
			j 同一趟内比较的次数  起始条件i+1 结束条件N 

【2】二维数组

	int [2];
	int a[3] [2];
	      |   |
		行数 列数	
		
		
	a[0] 行
		a[0][0]  a[0][1]
	a[1]
		a[1][0]  a[1][1]
	a[2]
		a[2][0]  a[2][1]
		
	初始化
		1.定义时初始化
			int a[3][2] = {1,2,3,4,5,6};
			int a[3][2] = {{1,2},{3,4},{5,6}};	
			int a[3][2] = {0};	
			int a[3][2] = {{1,},{3,},{5,}};		
			int a[][2] = {{1,2},{3,4},{5,6}};	
			
			注意:
				1.行号可以省略,列号不能省略
				2.二维数组名也是一个常量,它不能做如下操作a++
		2.先定义后初始化
			int a[3][2];
			for(i=0;i<3;i++){
				for(j=0;j<2;j++)
				a[i][j] = 5;
			}
				
	练习:
		1.打印杨辉三角(前10行)
			1
			1  1
			1  2  1
			1  3  3  1
			1  4  6  4  1
			1  5  10 10 5 1		
						
			
			int a[10][10]
			
		2.输入12个数,找到最大数的横坐标和纵坐标
			int [4][3];
		

【3】一维字符数组

	char a[3];
	 a[0] a[1]  a[2]
	
	
	赋值方式
		char a[] = {'h','e','l','l','o','\0','e'};
		
		 char b[10] = "hello";
	
	遍历方式
	    for(i=0; i<10; i++){
			putchar(a[i]);
		}
		puts("");
	    
		printf("%s\n",a); //%s遇到'\0'才会结束
		
	练习:
		1.拷贝strcpy //将一个数组的内容拷贝到另外一个数组中

		2.追加strcat //将一个数组的内容追加到另外一个数组的尾部

		3.比较strcmp

		4.长度strlen


【4】二维字符数组

	 char a[10][10];
     char a[][10] = {{"hello"},{"world"},{"test"}};
 
     for(i=0; i<3; i++){
         printf("%s\n",a[i]);
     }
     for(i=0; i<3; i++){
         for(j=0; j<10; j++){
             putchar(a[i][j]);
         }
         puts("");
     }

2020-8-27
回首再看这一章,陈旭,你发现了什么?
数组是使用最多的一个了。
在后面的结构体中,在结构体中加入数组元素,也是非常的常见的一种思路。我需要做什么?我可能需要先学习一段时间了,这样是最好的选择。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值