C基础数组和字符串的使用

Posted mChenys

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C基础数组和字符串的使用相关的知识,希望对你有一定的参考价值。

目录

一、一维数组

数组在内存中就是一段连续的空间,每个元素的类型是一样的

1.1 数组的定义

数组下标从0开始,数组的名字是一个常量,如果直接输出数组的名字得到的结果就是数组中第一个元素的地址

int array[10];//定义一个一维数组,名字叫array,一共有10个元素,每个元素都是int类型的

array[0] = 20;
array[1] = 30;
array[9] = 80;

//array[10] = 100;//错误,没有 array[10]这个元素
//array = 10 //报错 , 因为数组的名字是一个常量, 是不能赋值的. 只能改变数组元素的值

注意:如果定义的数组没有给元素赋值,那么默认的值是随机的。

#include<stdio.h>
int main()

	int arr[10];
	int i;
	for(i=0;i<10;i++)
	
        //输出未赋值的数组元素
		printf("%d\\n",arr[i]);
	

   //打印内存地址
	printf("%p,%p\\n",arr,&arr[0]);

	return 0;


结果:

1.2 数组的初始化

数组初始化时可以使用花括号来初始化,如下所示:

int array[10] =  100, 1, 5, 3, 4, 5, 6, 7, 8, 0 ;//定义数组的同时为数组的成员初始化值
int array[10] =  3, 7, 9 ;//将数组的前三个元素赋值,其余元素置为0
int array[10] =  0 ;//将数组所有的元素都置为0 ,Java的写法是:int a[] = new int[10]; 
int array []= 0,1,3,4,5; // 直接定义5个元素的数组
int i;
for (i = 0; i < 10; i++)

    array[i] = 0;//通过循环遍历数组的每个元素,将元素的值置为0

1.3 获取数组的长度

先通过sizeof先获取数组的大小,然后再除以单个元素的大小得到的就是数组的长度了

#include<stdio.h>
int main()

	int arr[] = 0,2,4,5,6,10,9;
	// 得到数组的长度 = 总字节数/单个元素所占的字节数
	int size = sizeof(arr)/sizeof(arr[0]); 
	int i;
	for(i=0;i<size;i++)
		printf("arr[%d]=%d\\n",i,arr[i]);
	
	return 0;


结果:

1.4 案例-查找数组最大值

#include<stdio.h>
int main()

	int arr[] = 90,12,10,36,42,20,15,6;
	int max=arr[0]; //最大值
	int size = sizeof(arr)/sizeof(arr[0]);
	int i;
	for(i=1;i<size;i++)
	
		if(max<arr[i])
		
			max = arr[i];//更新最大值
		
	
	printf("max=%d\\n",max);
	return 0;

结果:

1.5 案例-查找数组第二大元素

#include<stdio.h>
int main()

	int arr[] = 90,12,10,36,42,20,15,6;
	int max=arr[0];//最大值
	int smax = arr[1];//第二大值
	int size = sizeof(arr)/sizeof(arr[0]);
	int i;

	if(max<smax)
	
		max = arr[1];
		smax = arr[0];
	
	for(i=2;i<size;i++)
	
		if(max<arr[i])
		
			max = arr[i]; //更新最大值
			smax = max;//更新第二大值
		
		else if(arr[i]<max && arr[i]>smax)
		
			//如果介于最大和第二大之间,那么更新第二大值
			smax =arr[i];
		
	
	printf("max=%d,smax=%d\\n",max,smax);
	return 0;

1.6 数组逆置

#include<stdio.h>
int main()

	int arr[] =100,20,1,3,6,23,79,56,42;
	//实现倒序
	int start,end;
	int size = sizeof(arr)/sizeof(arr[0]);
	for(start=0,end=size-1;start<end;start++,end--)
	
		int temp = arr[start];
		arr[start] = arr[end];
		arr[end] = temp;
	
 //下面是用while循环的方式
//	end = size-1;
//	while(start<end)
//	
//
//		int temp = arr[start];
//		arr[start] = arr[end];
//		arr[end] = temp;
//		start++;
//		end--;
//	
	int i;
	for(i = 0 ; i < size; i++ )
	
		printf("%d ",arr[i]);
	
	printf("\\n");
	return 0;

1. 7 冒泡排序

将一个无序的数组排序成一个有序的数组,遍历一个数组,将最大的成员放到最后一个, 思路就是2个相邻的元素比较,把大的放到小的后面.下次循环只需要将剩下的元素进行冒泡即可.

#include<stdio.h>
int main()

	int arr[] = 1,100,20,12,34,50,14;
	//冒泡排序,相邻2个元素比较,大的放后面

	int i,j;
	int size = sizeof(arr)/sizeof(arr[0]);
	for(i = 0 ; i < size - 1 ; i++)//外循环控制次数
	
		for(j = 0; j < size - i -1 ; j++)//内循环进行比较,-i是因为每次循环减少一个元素,-1是避免越界
					
			if(arr[j] > arr[j+1])
			
                //交互位置
				int temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;
			
			
		
	
    //打印结果
	int x ;
	for(x = 0 ;x < size; x++)
	
		printf("%d ",arr[x]);
	
	printf("\\n");
	return 0;

二、二维数组

二维数组可以理解为一维数组的嵌套, 例如: int arr[10][10] ;表示有100个元素。

2.1 二维数组的定义

二维数组的定义需要使用2对中括号来表示,前一对中括号表示二维数组所包含的一维数组数量,后一个中括号表示每个包含的一维数组内可以存放多少个元素。

int array[2][3];//定义了一个二维数组,每个一维数组又包含3个一维数组,相当于又2*3=6个元素

注意: arr[0] 和arr[0][0] 是不一样的, 前着取出来的是一维数组, 后者取出来的是元素 , 数组的特点就是不能给数组名赋值,因为数组名是一个常量, 也就是说对于二维数组arr , arr[0]其实也是数组, 是不能赋值的.

2.2 二维数组的初始化和取值

常用的初始化方式有这几种:

int a[3][4] = 1,2,3,4,5,6,7,8,,9,10,11,12;//包含3个一维数组,每个一维数组内有4个元素
int a[3][4] = 1,2,3,4,5,6; //显示初始化了2个一维数组,其他会初始化为0
int a[3][4] = 0; //将所有成员初始化为0
int a[][4] = 1,2,3,4,5,6,7,8,9,10,11,12 // 第一个中括号可以不写值,这样表示有3组以为数组

取值方式如下:

#include<stdio.h>
int main()

    // 定义并初始化值
    // sizeof(arr)=3*3*4=36, 因为每个元素都是int类型,占用4个字节,所以总字节就是36BYTE
	int arr[3][3] = 0,1,2,3,4,5,6,7,8; 
    // 二维数组的内的一维数组个数  
	int out_size = sizeof(arr)/sizeof(arr[0]);
    // 二维数组内的一维数组的元素个数
	int inner_size = sizeof(arr[0]) / sizeof(arr[0][0]);

	int i,j;
	for(i=0;i<out_size;i++)
	
		for(j=0;j<inner_size;j++)
		
			printf("arr[%d][%d]=%d\\n",i,j,arr[i][j]);
		
	
	return 0;


结果:

三、三维数组

三维数组可以这样定义
int a[2][4][10];
表示的意思是这个3维数组包含2个二维数组, 数组名分别是a[0]和a[1], 而这2个二维数组又各自包含4个一维数组, 分别是:

a[0][0] ~a[0][3] 
a[1][0] ~a[1][3]

然后上面每个一维数组又各自包含10个元素,分别是:

a[0][0][0] ~a[0][3][9]
a[1][0][0] ~a[1][3][9]

同样的还可以有四维…多维等等.

3.1 三维数组的取值

#include<stdio.h>
int main()

     //定义一个3维数组,3维数组内有2个二维数组, 每个二维数组内有3个一维数组,每个一维数组内有4个元素
	int arr[2][3][4] = 
		1,2,3,4,5,6,7,8,9,10,11,12,
		13,14,15,16,17,18,19,20,21,22,23,24
	;
     // 上面定义的三维数组的字节数是 2*3*4*4BYTE
	int size1 = sizeof(arr)/sizeof(arr[0]); //三维数组的size
	int size2 = sizeof(arr[0]) / sizeof(arr[0][0]); //二维数组的size
	int size3 = sizeof(arr[0][0]) /sizeof(arr[0][0][0]); //一维数组的size

	printf("size1=%d,size2=%d,size3=%d\\n",size1,size2,size3);

	int x,y,z;
	for(x=0;x<size1;x++)
	
		for(y=0;y<size2;y++)
		
			for(z=0;z<size3;z++)
			
				printf("arr[%d][%d][%d]=%d\\t",x,y,z,arr[x][y][z]);
			
			printf("\\n");
		
		printf("\\n");
	
	return 0;


结果:

3.2 三维数组排序

使用的技巧是先将三维数组内的所有元素保存到一个一维数组内,然后对该一维数组进行排序,排完之后在保存到三维数组内

#include<stdio.h>
int main()

	int arr[2][3][4] = 
		12,21,13,45,15,62,17,81,19,10,11,212,
		3,14,15,16,17,168,19,20,1,212,213,254
	;

	int size1 = sizeof(arr)/sizeof(arr[0]);
	int size2 = sizeof(arr[0]) / sizeof(arr[0][0]);
	int size3 = sizeof(arr[0][0]) /sizeof(arr[0][0][0]);

	//先用一个一维数组变量来保存三维数组的所有元素
	int temp[size1*size2*size3];
	int index=0;

	int x,y,z;
	for(x=0;x<size1;x++)
	
		for(y=0;y<size2;y++)
		
			for(z=0;z<size3;z++)
			
				temp[index++] = arr[x][y][z]; 
			
		
	

	//排序一维数组,这里使用冒泡排序
	int size = sizeof(temp)/sizeof(temp[0]);
	int i,j;
	for(i拆分开头和结尾的空字符串[复制]

何时/为啥需要 '\0' 来标记 (char) 数组的结尾?

C++ --- 字符串与字符数组

计算有多少列表条目具有以特定char结尾的字符串属性

C++系列4:数据类型和变量

如何使用c ++从字符串的末尾删除撇号