实验5 指针
Posted joshh1230
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验5 指针相关的知识,希望对你有一定的参考价值。
1.task1
task1_1.c
#include<stdio.h> #define N 4 int main() int x[N]=1,9,8,4; int i; int *p; //方式1:通过数组名和下标遍历输出数组元素 for(i=0;i<N;++i) printf("%d",x[i]); printf("\\n"); //方式2:通过指针变量遍历输出数组元素(写法1) for(p=x;p<x+N;++p) printf("%d",*p); printf("\\n"); //方式2:通过指针变量遍历输出数组元素(写法2) p=x; for(i=0;i<N;++i) printf("%d",*(p+i)); printf("\\n"); //方式2:通过指针变量遍历输出数组元素(写法3) p=x; for(i=0;i<N;++i) printf("%d",p[i]); printf("\\n"); return 0;
task1_2.c
#include <stdio.h> int main() int x[2][4]=1,9,8,4,2,0,4,9; int i,j; int *p; int(*q)[4]; //使用数组名、下标访问二维数组元素 for(i=0;i<2;++i) for(j=0;j<4;++j) printf("%d",x[i][j]); printf("\\n"); //使用指针变量p间接访问二维数组 for(p=&x[0][0],i=0;p<&x[0][0]+8;++p,++i) printf("%d",*p); if((i+1)%4==0) printf("\\n"); //使用指针变量q间接访问二维数组 for(q=x;q<x+2;++q) for(j=0;j<4;++j) printf("%d",*(*q+j)); printf("\\n"); return 0;
2.task2
#include<stdio.h> #include<string.h> #define N 80 int main() char s1[]="Learning makes me happy"; char s2[]="Learning makes me sleepy"; char tmp[N]; printf("sizeof(s1)vs. strlen(s1):\\n"); printf("sizeof(s1)=%d\\n",sizeof(s1)); printf("strlen(s1)=%d\\n",strlen(s1)); printf("\\nbefore swap:\\n"); printf("s1:%s\\n",s1); printf("s2:%s\\n",s2); printf("\\nswapping...\\n"); strcpy(tmp,s1); strcpy(s1,s2); strcpy(s2,tmp); printf("\\nafter swap:\\n"); printf("s1:%s\\n",s1); printf("s2:%s\\n",s2); return 0;
1.数组s1的大小是23,sizeof(s1)计算的是s1占用的字节数,strlen(s1)计算的是s1的实际长度(除\\0以外的字符个数)
2.不能替换。数组只能在定义是对其赋值。
3.s1和s2内容交换了
task2_2.c
#include <stdio.h> #include<string.h> #define N 80 int main() char *s1="Learing makes me happy"; //char *s1; line 6代码可以换成这两行; //s1="Learning makes me happy"; char *s2="Learing makes me slpeey"; char *tmp; printf("sizeof(s1)vs.strlen(s1):\\n"); printf("sizeof(s1)=%d\\n",sizeof(s1)); printf("strlen(s1)=%d\\n",strlen(s1)); printf("\\nbefore swap:\\n"); printf("s1:%s\\n",s1); printf("s2:%s\\n",s2); printf("\\nswapping...\\n"); tmp=s1; s1=s2; s2=tmp; printf("\\nafter swap:\\n"); printf("s1:%s\\n",s1); printf("s2:%s\\n",s2); return 0;
1.指针变量s1中存放的是字符串,sizeof(s1)计算的是字符串所占用的字节数,strlen(s1)计算的是有效字符数(除\\0以外的字符个数)
2.可以替换。2.1中先定义一个空的数组s1,在s1中存放字符串。2.2中定义一个字符型指针变量s1,s1指向数组
3.交换的是指针的指向,s1和s2在内存存储单元中没有交换。
3.task3
task3.c
#include<stdio.h> void str_cpy(char *target,const char *source); void str_cat(char *str1,char *str2); int main() char s1[80],s2[20]="1984"; str_cpy(s1,s2); puts(s1); str_cat(s1,"Animal Farm"); puts(s1); return 0; void str_cpy(char *target,const char *source) while(*target++=*source++) ; void str_cat(char *str1,char *str2) while(*str1) str1++; while(*str1++=*str2++) ;
4.task4
task4.c
#include<stdio.h> #define N 80 int func(char*); int main() char str[80]; while(gets(str)!=NULL) if(func(str)) printf("yes\\n"); else printf("no\\n"); return 0; int func(char *str) char *begin,*end; begin=end=str; while(*end) end++; end--; while(begin<end) if(*begin!=*end) return 0; else begin++; end--; return 1;
5.task5
task5.c
#include<stdio.h> #define N 80 void func(char *); int main() char s[N]; while(scanf("%s",s)!=EOF) func(s); puts(s); return 0; void func(char *str) int i; char *p1,*p2,*p; p1=str; while(*p1==\'*\') p1++; p2=str; while(*p2) p2++; p2--; while(*p2==\'*\') p2--; p=str; i=0; while(p<p1) str[i]=*p; p++; i++; while(p<=p2) if(*p!=\'*\') str[i]=*p; i++; p++; while(*p!=\'\\0\') str[i]=*p; p++; i++; str[i]=\'\\0\';
6.task6
task6_1.c
#include<stdio.h> #include<string.h> void sort(char *name[],int n); int main() char *course[4]="C program","C++ Object Oriented Program","Operating System","Data Structure and Algorithms"; int i; sort(course,4); for(i=0;i<4;i++) printf("%s\\n",course[i]); return 0; void sort(char *name[],int n) int i,j; char *tmp; for(i=0;i<n-1;++i) for(j=0;j<n-1-i;++j) if(strcmp(name[j],name[j+1])>0)//strcmp比较字符串,<0表示s1<s2;>0表示s1大于s2 tmp=name[j]; name[j]=name[j+1]; name[j+1]=tmp;
task6_2.c
#include<stdio.h> #include<string.h> void sort(char *name[],int n); int main() char *course[4]="C program","C++ Object Oriented Program","Operating System","Data Structure and Algorithms"; int i; sort(course,4); for(i=0;i<4;i++) printf("%s\\n",course[i]); return 0; void sort(char *name[],int n) int i,j,k; char *tmp; for(i=0;i<n-1;i++) k=i; for(j=i+1;j<n;j++) if(strcmp(name[j],name[k])<0) k=j; if(k!=i) tmp=name[i]; name[i]=name[k]; name[k]=tmp;
两种算法实现中,交换的是指针变量的值。
7.task7
task7.c
#include <stdio.h> #include <string.h> #define N 5 int check_id(char *str); // 函数声明 int main() char *pid[N] = "31010120000721656X", "330106199609203301", "53010220051126571", "510104199211197977", "53010220051126133Y"; int i; for (i = 0; i < N; ++i) if (check_id(pid[i])) // 函数调用 printf("%s\\tTrue\\n", pid[i]); else printf("%s\\tFalse\\n", pid[i]); return 0; // 函数定义 // 功能: 检查指针str指向的身份证号码串形式上是否合法。 // 形式合法,返回1,否则,返回0 int check_id(char *str) if(strlen(str)!=18) return 0; else while(((*str>=\'0\'&&*str<=\'9\')||(*str==\'X\'))&&(*str!=\'\\0\')) str++; if(*str==\'\\0\') return 1; else return 0;
8.task8
task8.c
#include <stdio.h> #define N 80 void encoder(char *s); // 函数声明 void decoder(char *s); // 函数声明 int main() char words[N]; printf("输入英文文本: "); gets(words); printf("编码后的英文文本: "); encoder(words); // 函数调用 printf("%s\\n", words); printf("对编码后的英文文本解码: "); decoder(words); // 函数调用 printf("%s\\n", words); return 0; /*函数定义 功能:对s指向的字符串进行编码处理 编码规则: 对于a~z或A~Z之间的字母字符,用其后的字符替换; 其中,z用a替换,Z用A替换 其它非字母字符,保持不变 */ void encoder(char *s) char *p; p=s; while(*p) if((*p>=\'a\'&&*p<=\'z\')||(*p>=\'A\'&&*p<=\'Z\')) (*p)++; else if(*p==\'z\'||*p==\'Z\') *p=*p-25; p++; /*函数定义 功能:对s指向的字符串进行解码处理 解码规则: 对于a~z或A~Z之间的字母字符,用其前面的字符替换; 其中,a用z替换,A用Z替换 其它非字母字符,保持不变 */ void decoder(char *s) char *p; p=s; while(*p) if(*p>=\'b\'&&*p<=\'z\'||*p>=\'B\'&&*p<=\'Z\') (*p)--; else if (*p==\'a\'||*p==\'A\') *p=*p+25; p++;
指针实验
实验项目:指针实验
姓名:黄澄? ? 实验地点:514教室? ?实验时间:2019.6.13
一、目的和要求
1、掌握指针的概念和定义方法
2、掌握指针的操作符和指针的运算
3、掌握指针与数组的关系
4、掌握指针与字符串的关系
5、熟悉指针作为函数的参数以及返回指针的函数
6、了解函数指针
二、实验内容
实验练习8.3.11
问题的简单描述:
(1)定义一个整型指针变量p,使它指向一个整型变量a,定义一个浮点型指针q,使它指向一个浮点型变量b,同时定义另外一个整型变量c并赋初值3(2)使用指针变量,调用scanf函数分别输入a和b的值(3)通过指针间接访问并输出a,b的值(4)按十六进制方式输出p,q的值以及a,b的地址(5)将p指向c,通过p间接访问c的值并输出(6)输出p的值及c的地址,并与上面的结果进行比较
2、实验代码
#include<stdio.h>
int main()
int *p,a,c=2;
float *q,b;
p=&a;
q=&b;
printf("please input the value of a,b:");
scanf("%d%f",&a,&b);//使用指针p和q输入a,b的值
printf("result:\\n");
printf(" %d,%f\\n",a,b);
printf(" %d,%f\\n",*p,*q);//指针p和q间接输出a,b的值
printf("The Address of a,b:%p,%p\\n",&a,&b);
printf("The Address of a,b:%p,%p\\n",p,q);//输出p和q的值并与上行输出结果进行比较
p=&c;
printf("c=%d\\n",*p);
printf("The Address of c:%x,%x\\n",*p,p);//输出p的值以及c的地址
return 0;
3问题分析:
实验练习8.3.2?
1问题的简单描述:
(1)定义两个函数,分别为void swap1(int a,int b)和swap2(inta.intb),用于交换a,b的值。(2)从主函数中分别输入两个整型变量a、b。(3)从主函数中分别调用上述两个交换函数,并打印输出交换后a、b的结果。
2、实验代码
#include<stdio.h>
void swap1(int x,int y);
void swap2(int *x,int *y);
int main()
int a,b;
printf("please input a=:");
scanf("%d",&a);
printf("\\n b=:");
scanf("%d",&b);
swap1(a,b);
printf("\\nAfter Call swap1:a=%d n=%d\\n",a,b);
swap2(&a,&b);
printf("\\nAfter Call swap2:a=%d n=%d\\n",a,b);
return 0;
void swap1(int x,int y)
int temp;
temp=x;
x=y;
y=temp;
void swap2(int *x,int *y)
int temp;
temp=*x;
*x=*y;
*y=temp;
3问题分析:
实验练习8.3.3
?1问题的简单描述
(1)定义两个字符指针,通过gets()函数输入两个字符串。(2)定义一个函数charreverse(charstr),通过指针移动方式将字符串反转。(3)定义一个函charlink(charstr1,char*str2),通过指针移动方式将两个字符串连接起来。(4)从主函数中分别调用上述函数,输入字符串并打印输出结果。
2实验代码:
#include<stdio.h>
char *reverse(char *str);
char *link(char *str1,char *str2);
int main()
char str[30],str1[30],*str2;
printf("Input Reversed Character String:");
gets(str);
str2=reverse(str);
printf("\\nOutput Reversed Character String:");
puts(str2);
printf("Input string1:");
gets(str);
printf("\\nInput String2:");
gets(str1);
str2=link(str,str1);
puts(str2);
return 0;
char *reverse(char *str)
char *p,*q,temp;
p=str,q=str;
while(*p!='\\0')//判断是否到达最后一个字符
p++;
p--;
while(q<p)
temp=*q;
*q=*p;
*p=temp;
q++;
p--;
return str;
char *link(char *str1,char *str2)
char *p=str1,*q=str2;
while(*p!='\\0')
p++;
while(*q!='\\0')
*p=*q;
p++;
q--;
*p='\\0';
return str1;
3问题分析:
实验练习8.3.3?1
问题的简单描述:??
(1)定义一个整型一维数组,任意输入数组的元素,其中包含奇数和偶数。
?(2)定义一个函数,实现将数组元素奇数在左,偶数在右的排列。
?(3)在上述定义的函数中,不允许再增加新的数组。
?(4)从主函数中分别调用上述函数,打印输出结果。
2实验代码:
#include<stdio.h>
#define N 10
void arrsort(int a[],int n);
int main()
int a[N],i;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
arrsort(a,N);
for(i=0;i<N;i++)
printf("%d ",a[i]);
void arrsort(int a[],int n)
int *p,*q,temp;
p=a;
q=a+n-1;
while(p<q)
while(*p%2==1)
p++;
while(*q%2==0)
q--;
if(p>q)
break;
else
temp=*p;
*p=*q;
*q=temp;
p++;
q--;
3问题分析
三、实验小结
以上是关于实验5 指针的主要内容,如果未能解决你的问题,请参考以下文章