数组(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;
}