【C语言程序设计】实验七 指针

实验二 数据类型运算符与表达式

实验三 选择结构程序设计

实验四 循环结构序设计

实验五 数组和字符串

实验六 函数

实验七 指针

实验八 结构体与文件读写

结课实验 俄罗斯方块小游戏

目录

前言

知识纲要

实验内容

实验结果

第一个小实验

第二个小实验

 第三个小实验

结语


前言

这一系列文章所记录的是大一上学期学的一门名为《C语言程序设计》的实验内容,一共包括了八个实验,由于实验一是安装VC以及打印“hello,world”的基本操作,故没有放在这个系列里面,这些实验的代码部分参考与网上,仅供学习和参考~ 


知识纲要

  1. 指针和地址是同一个概念,指针变量是用来存放其它变量地址的变量。一个变量可能会占一个或用多个字节(由其类型决定),变量的地址是其所占存储空间第一个字节的地址,求变量的地址用“&”运算符。指向不同数据类型的指针是类型不同的指针。
  2. 通过指针变量引用所指向的变量前必须先将变量的地址赋值给指针,引用所指向的变量要用指针(间接)运算符“*”,多级指针则要用多个“*”。
  3. 指针变量只能与整数n相加减,但要注意实际地址的运算要先用n乘以所指向数据类型的长度,再与原来的地址相加;两个指针相减和关系运算只能在同一数组中对各元素地址进行,相减的结果是元素下标的差,比较的结果是它们的先后顺序(相等时表示指向同一元素);两个指针进行加、乘、除,或指针与整数相乘均没有任何意义。
  4. 数组名可以理解为指针常量,引用数组元素除可以用下标法外,还可以使用地址法和指针法。一维数组名的指针类型是指向与其元素类型一致的指针类型;二维数组的数组名是一个二级指针(也可以说是指向一维数组的指针),二维数组作一维引用时是一级指针,其指针类型为指向元素类型的指针。二级指针经过一次间接运算后还是指针,但指针的类型不同了,变成了一级指针。
  5. 元素的类型为同类型指针的数组称为指针数组,主要用于处理多个不定长的字符串。要注意与指向数组的指针相区别。

    类型符  * 数组名  [元素个数];\\指针数组

    类型符 (* 数组名) [元素个数];\\指向一维数组的指针

  6. 指针作为函数的参数时,传递给被调用函数的是实参的地址,在被调用函数中通过行参指针对变量的操作会影响到实参的值,这与普通变量作为函数参数传值调用不同。
  7. 在数组作为函数参数时,行参可以是数组名或同类形的指针,调用时实参也可以是数组名或同类形的指针,两者可以任意组合,其实质就是将实参数组的起始地址传递给被调用函数,在被调用函数中通过实参传来的地址去访问数组的各个元素。 类型符 * 函数名(行参列表){  函数体  }
  8. 程序运行时函数的程序代码也要装入内存才能运行,函数所占用的内存空间也有一个起始地址,这就是函数的入口地址,可以声明一个指向这个入口地址的指针变量,这就是指向函数的指针。   类型符 (* 函数名)(行参列表);给指向函数的指针变量赋值只能用函数名,不能写成函数调用,如:正确用法: p=sin;  错误用法:p=sin(x);

实验内容

1.数组排序:

编写以下三函数(参数a为数组,p为指向数组第一个元素的指针指针,n为数组的长度)

void Init(int a[],int n); 随机生成元素取值范围在0到99的数组

void Sort(int *p,int n); 用选择法对数组中的元素从小到大排序

void Print(int *p,int n); 在屏幕上输出数组各元素的值(逗号分隔)

在主函数中调用Init函数随机生成两个数组a和b的元素, 调用Sort函数对数组元素排序,调用Print函数输出数组排序前后各元素的值;将数组a和b合并到c后再调用Sort函数对其排序,并输出排序前后数组c中各元素的值。

        提示:

        产生随机数需用到在stdlib.h中声明rand()函数、srand()函数 和在time.h中声明的time( )函数。详细用法说明参见实验5。

2.编写一个程序,输入月份,输出该月份的英文名称。例如:输入“3”则输出该月份的英文名称“March”。要求用指针数组处理

3.字符替换:编写一个函数strchange,其原型为:

char *strchange( char * str, char c1,char c2 );

参数str为字符串的起始地址,c1为要在字符串中查找的字符,c2为要替换成的字符;函数的功能是:在字符串str中查找所有等于c1的字符,将其替换为c2中的字符。函数的返回值是替换后的字符串的起始地址(注:不能将函数中定义的字符数组的起始地址作为函数的返回值)。

在主函数中输入一个字符串和要查找和替换为的字符(注意:%c格式不是scanf函数的第一个格式符时要注意分割符对其输入的影响),调用strchange函数后在主函数中输出替换后的字符串


实验结果

第一个小实验

//1、	数组排序:
//编写以下三函数(参数a为数组,p为指向数组第一个元素的指针指针,n为数组的长度)
//void Init(int a[],int n);	随机生成元素取值范围在0到99的数组
//void Sort(int *p,int n);	用选择法对数组中的元素从小到大排序W
//void Print(int *p,int n);	在屏幕上输出数组各元素的值(逗号分隔)
//在主函数中调用Init函数随机生成两个数组a和b的元素, 调用Sort函数对数组元素排序,调用Print函数输出数组排序前后各元素的值;将数组a和b合并到c后再调用Sort函数对其排序,并输出排序前后数组c中各元素的值。
//提示:
//产生随机数需用到在stdlib.h中声明rand()函数、srand()函数 和在time.h中声明的time( )函数。详细用法说明参见实验5。
//
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define N 3
#define M 4
void Init(int x[],int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		x[i]=rand()%100;
	}
}

void Sort(int *p,int n)
{
	int i,j,k,temp;
	for(i=0;i<n-1;i++)
	{
		k=i;
		for(j=i+1;j<n;j++)
			if(*(p+j)>*(p+k))
				k=j;
		        temp=*(p+k);
				*(p+k)=*(p+i);
				*(p+i)=temp;
	}
}

void print(int x[],int n)
{
	int i;
	for(i=0;i<n;i++)
	{
	printf("%d",x[i]);
	}
}

int main()
{
	int a[M],b[N],c[M+N];
	int i=0;
	int	j=0;
	int k=0;
	srand((unsigned)time(NULL));
    Init(a,M);
	Init(b,N);
	printf("排序前:\n");
	printf("数组a为");print(a,M);
	printf("数组b为");print(b,N);
	Sort(a,M);
	Sort(b,N);
	printf("排序后:\n");
	printf("数组a为");print(a,M);
	printf("数组b为");print(b,N);
	while(i<M)//M=4,N=3
		c[k++]=a[i++];
	while(j<N)
		c[k++]=b[j++];
	printf("一合并后的数组c为\n");
	printf("排序前是:");print(c,M+N);
	Sort(c,M+N);
	printf("排序后是:");print(c,M+N);
	return 0;
}

第二个小实验

//2、	编写一个程序,输入月份,输出该月份的英文名称。例如:输入“3”则输出该月份的英文名称“March”。要求用指针数组处理
#include<stdio.h>
int main()
{
	char*month[]={"illegal month","January","February","March","April","May","June","July","August","September","October","November","December"};
	int n;
	printf("input month;\n");
	scanf("%d",&n);
	if(n>=0&&n<=12)
	{
		printf("%s",month[n]);
	}
	else
		printf("illegal");
	return 0;
}



//int main()
//{
//	char*p1;
//	char*p2;
//	char*p3;
//	char*p4;
//	int n;
//	p1="january";
//	p2="february";
//	p3="march";
//	p4="april";
//	printf("请输入一个月份,将输出该月份的英文名称");
//	scanf("%d",&n);
//	if(n=*p1)
//		printf("%ch",p1);
//	if(n=*p2)
//		printf("%ch",p2);
//	return 0;
//}

 第三个小实验

//3、	字符替换:编写一个函数strchange,其原型为:
//char *strchange( char * str, char c1,char c2 );
//参数str为字符串的起始地址,c1为要在字符串中查找的字符,c2为要替换成的字符;函数的功能是:在字符串str中查找所有等于c1的字符,将其替换为c2中的字符。
//函数的返回值是替换后的字符串的起始地址(注:不能将函数中定义的字符数组的起始地址作为函数的返回值)。
//在主函数中输入一个字符串和要查找和替换为的字符(注意:%c格式不是scanf函数的第一个格式符时要注意分割符对其输入的影响),
//调用strchange函数后在主函数中输出替换后的字符串。
#include<stdio.h>
char *strchange(char*str,char c1,char c2)
{
	char *p=str;
	while(*p!='\0')
	{
	if(*p==c1)
		*p=c2;
	     p++;
	}
	return str;
}
int main()
{
	char a[20],f,c,*p;
	char *strchange(char*str,char c1,char c2);
	printf("请输入一个字符串:");
	gets(a);
	printf("输入查找和替换的字符c1,c2:");
	scanf("%c,%c",&f,&c);//c1是要查找的字符,c2是要替换的字符
	printf("替换后的字符串是:%s\n",strchange(a,f,c));


}

结语

如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hiddenSharp429

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值