C语言学习第六章——数组

C语言学习第六章——数组,第1张

C语言学习第六章——数组

单位换算
1KB=210B=1024B
1MB=210KB=1024KB
1GB=210MB=1024MB
内存地址
以2GB内存地址为例,2GB=231B,计算机就为这231个存储单元(字节)的位置编码:

#include
int main(void){
	int a,b,c;
	printf("%p,%p,%pn",&a,&b,&c); 
	
	int d[3];
	d[0]=1,d[1]=2,d[2]=3;
	printf("%d,%d,%dn",d[0],d[1],d[2]);
	printf("%p,%p,%pn",&d[0],&d[1],&d[2]);
	return 0;
}
一维数组

定义数组及初始化

#include
int main(void){
	//1.定义数组 
	//int a[2*2];

	const int b=2;		//常变量 
	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};		//在不完全初始化中,元素如果未被初始化将会有一个默认值0 
	for(int i=0;i<4;++i)
		printf("%dn",a[i]); 
	return 0;
}

数组的排序

#include
int main(void){
	int a[5] = {89,34,-56,1,23};
	 
	int len = 5;
	
	//选择排序
	for(int j=0;j指针

#include
void f1(int b){
	b=10;
}
void f2(int *c){
	*c=10;
}
int main(void){
	int *p;		//p时int *类型的,用来存放int型变量的地址 	读作:定义了一个指向 int的指针变量 p 
	int a=2;
	p=&a;		//p指向 a 
	*p=3;		/
	for(int from=0,end=len-1;from a[(from+end)/2])
			from = (from+end)/2+1;
		else
			end = (from+end)/2-1;
	}
	return -1;
}
int main(void){
	int a[LEN]={3,6,9,12,15};
	
	//insert(a,2,8);
	//invert(a);
	//printf("%dn",find1(a,12));		//3
	//printf("%dn",find1(a,7));		//-1
	printf("%dn",find2(a,15));		//4
	printf("%dn",find2(a,7));		//-1
	show(a);
	//printf("有效元素的个数为:%dn",length(a));
	//show(a);
	return 0;
}
二维数组

二维数组的定义及初始化
1.二维数组定义的一般形式:
类型说明符 数组名 [常量表达式][常量表达式]

2.二维数组在内存中的存储方式
例如:int a[2][3]; 这里定义了一个2行3列的数组,我们可以把它看成一个表格:

但实际内存是线性的,(假设此二维数组从第1000个字节处开始存放)所以实际储存方式如下::

#include
int main(void){
//1.完全初始化 
	//int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
	
//2.不完全初始化
	//int a[3][4] = {1}; 	//1,0,0,0,0,0,0,0,0,0,0,0
	//int a[3][4]={{1,2,3,4},{},{9,10,11,12}};	//只适合部分编译器 
	//int a[3][4] = {{1},{2,3},{4}};	//1,0,0,0,2,3,0,0,4,0,0,0
	//int a[3][4] = {{1},{2,3}};	//1,0,0,0,2,3,0,0,0,0,0,0
	int a[][4]={1,2,3,4,5,6,7,8,9,10,11};	//1,2,3,4,5,6,7,8,9,10,11,0
	
	
	//输出方式2
	for(int i=0;i<12;++i)
		printf("%dn",a[i/4][i%4]); 
			return 0;
}

通过指针引用多维数组

&a[1]:1012
a[1]+2:1020
*(a+0)+1:1004
&a[1][1]:1016
*( *(a+1)+2):6

求二维数组的鞍点
鞍点:某行最大值+某列最小值

#include
#define M 5
#define N 6
bool f(int (*a)[N],int i,int j){
	for(int x=0;x字符数组

#include
int main(void){
	char a[10]={'h','a',' ','h','a','n'};		//''空字符 是C语言中字符串结束的标志 
	printf("hahahehe");		//输出haha 
	printf("%s","ABCD");		//字符串常量末尾都有一个空字符 
	printf("%s",a);
	
	//字符型数组定义时初始化所有特有的形式 
	char b[10] = {"ha han"};
	char c[10] = "ha han";
	char d[]="ha";		// d 数组有3个元素 
	//c = "ha han";		//error 因为c是一个char * 类型的常量 
	char *ch = "ha han";	//字符串常量在计算机的内存当中是一个没有名字的数组 
	printf("AAA%s",ch);
	return 0;
}

字符串的输入和输出

#include
void show(char *a,int len){
	for(int i=0;i 

处理字符串的函数
库函数#include

#include
//有效长度 
int strlen(char *a){
	if(a == NULL)
		return 0;
	int len = 0;
	while(a[len] != '')
		len++;
	return len;
} 
//小写
char *strlwr(char *a){
	if(a == NULL)
		return NULL;
	char *a1 = a;
	while(*a != ''){
		if(*a <= 'Z' && *a >= 'A')
			*a += 32;
		++a;
	}
	return a1;
} 
//大写
char *strupr(char *a){
	if(a == NULL)
		return NULL;
	char *a1 = a;
	while(*a != ''){
		if(*a <= 'z' && *a >= 'a')
			*a -= 32;
		++a;
	}
	return a1;
} 
//复制 
char *strcpy(char *a,char *b){
	if(a == NULL||b == NULL)
		return a;
	char *a1 = a;
	
	while((*(a++) = *(b++))!= '')
		;
	return a1;
}
//连接 
char *strcat(char *a,char *b){
	if(a == NULL||b == NULL)
		return a;
	char *a1 = a;
	while(*(a++) != '')
		;
	a--;
	while((*(a++) = *(b++))!= '')
		;
	return a1;
}
//覆盖 
char *strncpy(char *a,char *b,int n){
	if(a == NULL||b == NULL)
		return a;
	char *a1 = a;
	for(int i=0;i*b)
			return 1;
		a++,b++;
	}while(true);
 } 
int main(void){		//以上函数注释掉也可以运行,在库函数#include中 
	char a[] = "ABChaha";
	printf("%dn",strlen(a));
	printf("%sn",strlwr(a));
	printf("%sn",strupr(a));
	printf("%sn",strcpy(a,"lala"));
	printf("%sn",strcat(a,"123"));
	printf("%sn",strncpy(a,"abcdef",4));
	printf("%dn",strcmp("abcde","abde"));
	return 0;
}

习题1
1.输出以下杨辉三角形(要求输出10行)

方法一:

#include
#define N 10
int main(void){
	int a[N][N]={0};
	for(int i=0;i=2&&j>=1)
				a[i][j]=a[i-1][j-1]+a[i-1][j];
			printf("%5d",a[i][j]);
		} 
		putchar('n');
	}
	return 0;
}

方法二:

#include
#define N 10
void show(int a[N][N]){
	for(int i=0;i 

习题2
2.有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,如下图:

#include
#define N 10
void show(int a[]){
	for(int i=0;i=0&&m<=N)
			break;
		printf("输入有误。"); 
	}while(1);
	for(int i = N-m;i 

习题3
3.有n个人围城一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的原来第几号的那位。

#include
int main(void){
	int a[1000]={0};
	printf("请输入总人数:");
	int n;
	scanf("%d",&n);
	for(int i=0,cnt=0,sum=0;sum!=n-1;++i){
		if(a[i%n]==3)
			continue;
		if((a[i%n]=(cnt++)%3+1)==3)
			sum++;
	}
	int i;
	for(i=0;i					
										


					

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5521306.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存