实验6
实验任务1:使用指针变量间接访问一维数组元素
#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; }
#include<stdio.h> #define N 4 int main() { char x[N] = {'1','9','8','4'}; int i; char *p; //方式1:通过数组名和下标遍历输出数组元素 for(i=0;i<N;++i) printf("%c",x[i]); printf("\n"); //方式2:通过指针变量遍历输出数组元素(写法1) for(p=x;p<x+N;++p) printf("%c",*p); printf("\n"); //方式2:通过指针变量遍历输出数组元素(写法2) p=x; for(i=0;i<N;++i) printf("%c",*(p+i)); printf("\n"); //方式2:通过指针变量遍历输出数组元素(写法3) p=x; for(i=0;i<N;++i) printf("%c",p[i]); printf("\n"); return 0; }
task1_1.c执行后p存放的地址值是:2003
task1_2.c执行后p存放的地址值是:2008
实验任务2:使用指针变量间接访问二维数组元素
#include<stdio.h> int main() { int x[2][4]={{1,9,8,4},{2,0,2,2}}; int i,j; int *p; //指针变量,存放int类型数据的地址 int (*q)[4]; //指针变量,指向包含4个int型元素的一维数组 //使用数组名、下标访问二维数组元素 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; }
问题1:2004、2016
问题2:2008、2032
问题3:列指针每次指向下一个、行指针每次指向下一行。
实验任务3:使用指针变量处理字符串
#include<stdio.h> #include<string.h> #define N 80 int main() { char s1[] ="C,I love u."; char s2[] ="C,I hate u."; 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; }
#include<stdio.h> #include<string.h> #define N 80 int main() { char *s1="C,I love u."; char *s2 ="C,I hate u."; 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:数组的长度、字符串的长度
问题2:不能
问题3:是
问题1:字符串的地址、指针的长度、字符串的长度
问题2:不能
问题3:交换两个指针指向的地址、内存存储没有交换
实验任务4:身份证号码形式合法性判断
#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) { int i; char *p; p=str; while(*p) { if(*p>='0'&&*p<='9'||*p=='X') i++; p++; } if (i==18) return 1; else return 0; }
实验任务5:回文串判断
#include<stdio.h> #include<string.h> #define N 80 int is_palindrome(char *s);//函数声明 int main() { char str[N]; int flag; printf("Enter a string:\n"); gets(str); flag = is_palindrome(str);//函数调用 if (flag) printf("YES\n"); else printf("NO\n"); return 0; } //函数定义 //功能:判断s指向的字符串是否是回文串 //如果是,返回1;否则,返回0 int is_palindrome(char *s) { char *p,*q; q=s+strlen(s)-1; p=s; while(p<q){ if(*p!=*q) break; p++; q--; } if(p>=q) return 1; else return 0; }
实验任务6:简单的英文文本加密、解密
#include <stdio.h> #define N 80 void encoder(char *s); void decoder(char *s); int main() { char words[N]; printf("English: "); gets(words); printf("encoding: "); encoder(words); // printf("%s\n", words); printf("decoding: "); decoder(words); // printf("%s\n", words); return 0; } void encoder(char *s) { char *p; p=s; while(*p){ if(*p>=65&&*p<=89||*p>=97&&*p<=121) *p+=1; else if(*p==90||*p==122) *p-=25; p++; } } void decoder(char *s) { char *p; p=s; while(*p){ if(*p>=66&&*p<=90||*p>=98&&*p<=122) *p-=1; else if(*p==65||*p==97) *p+=25; p++; } }
实验总结:了解了指针变量的用法