Skip to content

数组(1)

1091字约4分钟

2024-07-07

38.单位换算

1KB=2^10B=1024B 1MB=2^10KB=1024KB 1GB=2^10MB=1024MB

#include <stdio.h>
int main(void)
{
	int a,b,c;
	printf("%p,%p,%p",&a,&b,&c);               //%p,%o,%x以16进制格式输出,但是随机产生的数值可能不连续




	int d[3];
	d[0] = 1,d[1] = 2,d[2]= 3;
	printf("%d,%d,%d",d[0],d[1],d[2]);
	printf("%p,%p,%p\n",&d[0],&d[1],&d[2]);
	return 0;


}

39.数组定义时初始化

#include <stdio.h>
#include <stdbool.h>
int main(void)
{
	//1.定义数组
/*	int a[2*2];
	int b =2;
	int c[2*b];    error
	return 0;
*/
	const int b=2;  //整型常变量b
	int c[2*b];
//	int e[3.1]     error 必须为整数
	int e[(int)3.1];
	int f['A'];
	int g[true]; 




	//2.定义并初始化数组
	/*
	int a[4]={1,2,3,4};           //数组完全初始化
	int a[ ]={1,2,3,4};
	*/
	int a[4]={1};                 //数组部分初始化,没有元素默认为0
	for(int i = 0;i<4; ++i)
	{
		printf("%d\n",a[i]);
	}
	return 0;


}

40.数组排序

#include <stdio.h>
int main(void)
{
	int a[5] ={89,23,64,22,54};
	int len =5;
	//冒泡排序
/*	for(int k=0;k<len-1;++k)
	{
		for(int i =0;i<len-1-k,++i)
		{
			int b = a[i];
			a[i]=a[i+1];
			a[i+1]=b;
		}
	}
*/
	//选择排序
	int b,c,i,j;
	for(int k=0;k<len-1;++k)
	{
		for(int i=0;i<len-k;++i)
		{
			if(a[c]<a[i])
				c=i;
		}
		int b= a[c];
		a[c]= a[i-1];
		a[i-1]=b;
	}
	for(int j=0;j<len;++j);
	{
		printf("%d",a[j]);
	}
	putchar('\n');
	return 0;
}

41.指针

#include <stdio.h>
int a =2;
void f1(int b)
{
	b=10;
}
void f2(int *c)
{
	*c=a;
}
int main(void)
{
	int*p;                      //p是int*类型的,用来存放int型变量的地址,读作:定义了一个指向int 的指针变量b
	p = &a;                     //p指向a
	*p =3;                      //*p等价于a
	f1(a);
	f2(&a);                     //通过函数改变main函数当中的一个变量,就需要对这个变量取地址
	printf("%d",a);
	scanf("%d",&a);




	int d[3];                   //数组d是int *类型的常量,其值为d[0]地址
	p=d;
	p[0]=1;
	p[1]=2;
	p[2]=3;


//	printf("%d,%d,%d,%d",d[-1],d[4],d[5])  error报错
	*p =10;
	*(p+1)=20;                   //等价于*(d+1)=20;,但是是一个常数,不能再次赋值
	*(p+2)=30;		     //*p(p+2)->p[2] *(p+2)和*2(p)  *(2+p)等价
	printf("%o,%o,%0,%o",p,p+1,p+2);
	for(int i=0;i<3;++i)
		printf("%5d",d[i]);  //p+n实际上是p +sizeof(*p)*n
	return 0;
}

42.数组的增删改查及倒置

#include <stdio.h>
#include <stdbool.h>
#define LEN 10
int length(int * a) //参数可以写成int a[LEN]或者int a[]都代表a是一个int *a的变量
{
	int j=0;
	while(j<LEN)
	{
		if(a[j]==0)
		break;
	else
		++j;
	}
	return j;
}
void show(int a[])
{
	int len =length(a);
	for(int i=0;i<len;++i)
		printf("%5d",a[i]);
	putchar('\n');
}
bool del(int * a,int index)
{
	int len = length(a);
	if(len ==0 || index>len-1)
		return false;
	else
	{
		for(int i=index+1;i<len;++i)
			a[i-1]=a[i];
		a[len-1]=0;
		return true;
	}
}
bool insert(int*a,int index,int value) //插入
{
	int len=length(a);
	if(len==LEN || index >len)
		return false;
	else
	{
	for(int i=len-1;i>=index;--i)
		a[i+1]=a[i];
		return true;
	}
}
void invert(int*a)                      //倒置
{
	int len =length(a);
	int from=0;
	int end=len-1;
	while(from<end)
	{
		int d =a[from];
		a[from]=a[end];
		a[end]=d;
		from++;
		end--;
	}
}




int find1(int*a,int value)             //查找
{
	int len=length(a);
	for(int i =0;i<=100;++i)
	{
		if(a[i]==value)
			return i;
	}
}
int find2(int*a,int value)            //二分查找,数组必须按序排列
{
	int len = length(a);
	int from= 0;
	int end=len-1;
	while(from<=end)
	{
		if(value == a[(from+end)/2])
			return (from+end)/2;
		else if(value >a[from+end])
			from=(from+end)/2+1;
		else
			end=(from+end)/2-1;
	}
	return -1;
}


int main(void)
{
	int a[LEN]={3,6,9,12,15};
	invert(a);
	insert(a,3,8);
	if(del(a,2))
		show(a);
	else
		printf("删除失败");
	return  0;
}

43.1二维数组定义初始化

#include <stdio.h>
int main(void)
{
// int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};     完全初始化
	/*
	int a[3][4]={
		{1,2,3,4}
		{5,6,7,8}
		{9,10,11,12}
		};
	*/


//	int a[3][4]={1};                         第一位为1,其余为0
//	int a[3][4]={{1,2,3,4}{}{9,10,11,12}};   只适合部分编译器
//	int a[3][4]={{1}{2,3}{4}};
//	int a[3][4]={{1}{2,3}};
	int a[][4]={1,2,3,4,5,6,7,8,9,10,11};
	/*输出方式
	for(int i =0;i<3;++i)
		for(int j=0;j<4;++j)
			printf("%d\n",a[i][j]);
	*/
	//输出方式2
	int j;
	for(int i=0;i<12;++i)
		printf("%d\n",a[i/4][j%4]);
	return 0;	
}