目录
前言
这一系列文章所记录的是大一上学期学的一门名为《C语言程序设计》的实验内容,一共包括了八个实验,由于实验一是安装VC以及打印“hello,world”的基本操作,故没有放在这个系列里面,这些实验的代码部分参考与网上,仅供学习和参考~
知识纲要
- 指针和地址是同一个概念,指针变量是用来存放其它变量地址的变量。一个变量可能会占一个或用多个字节(由其类型决定),变量的地址是其所占存储空间第一个字节的地址,求变量的地址用“&”运算符。指向不同数据类型的指针是类型不同的指针。
- 通过指针变量引用所指向的变量前必须先将变量的地址赋值给指针,引用所指向的变量要用指针(间接)运算符“*”,多级指针则要用多个“*”。
- 指针变量只能与整数n相加减,但要注意实际地址的运算要先用n乘以所指向数据类型的长度,再与原来的地址相加;两个指针相减和关系运算只能在同一数组中对各元素地址进行,相减的结果是元素下标的差,比较的结果是它们的先后顺序(相等时表示指向同一元素);两个指针进行加、乘、除,或指针与整数相乘均没有任何意义。
- 数组名可以理解为指针常量,引用数组元素除可以用下标法外,还可以使用地址法和指针法。一维数组名的指针类型是指向与其元素类型一致的指针类型;二维数组的数组名是一个二级指针(也可以说是指向一维数组的指针),二维数组作一维引用时是一级指针,其指针类型为指向元素类型的指针。二级指针经过一次间接运算后还是指针,但指针的类型不同了,变成了一级指针。
- 元素的类型为同类型指针的数组称为指针数组,主要用于处理多个不定长的字符串。要注意与指向数组的指针相区别。
类型符 * 数组名 [元素个数];\\指针数组
类型符 (* 数组名) [元素个数];\\指向一维数组的指针
- 指针作为函数的参数时,传递给被调用函数的是实参的地址,在被调用函数中通过行参指针对变量的操作会影响到实参的值,这与普通变量作为函数参数传值调用不同。
- 在数组作为函数参数时,行参可以是数组名或同类形的指针,调用时实参也可以是数组名或同类形的指针,两者可以任意组合,其实质就是将实参数组的起始地址传递给被调用函数,在被调用函数中通过实参传来的地址去访问数组的各个元素。 类型符 * 函数名(行参列表){ 函数体 }
- 程序运行时函数的程序代码也要装入内存才能运行,函数所占用的内存空间也有一个起始地址,这就是函数的入口地址,可以声明一个指向这个入口地址的指针变量,这就是指向函数的指针。 类型符 (* 函数名)(行参列表);给指向函数的指针变量赋值只能用函数名,不能写成函数调用,如:正确用法: 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));
}
结语
如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!