1.输入两个整数,按大到小顺序输出(使用指针,使用两种方法)
方法一:
#include<stdio.h>
int main()
{
int a,b,*p1,*p2,*p;
scanf("%d%d", &a, &b);
p1=&a;
p2=&b;
if(a<b){
p=p1;
p1=p2;
p2=p;
}
printf("max=%d min=%d\n", *p1, *p2);
return 0;
}
方法二:
#include <stdio.h>
void swap(int *p1, int *p2){
int p;
p=*p1;
*p1=*p2;
*p2=p;
}
int main(){
int a,b,*p1,*p2,*p;
scanf("%d%d", &a, &b);
p1=&a;
p2=&b;
if(a<b){
swap(p1,p2);
}
printf("max=%d min=%d\n", *p1, *p2);
return 0;
}
2.输入三个整数,按大到小输出(使用指针)
#include <stdio.h>
void swap(int *pt1, int *pt2);
void exchange(int *q1, int *q2, int *q3);
int main(){
int a,b,c,*p1,*p2,*p3,*p;
scanf("%d%d%d", &a, &b, &c);
p1=&a;
p2=&b;
p3=&c;
exchange(p1,p2,p3);
printf("%d %d %d\n", a, b,c);
return 0;
}
void exchange(int *q1, int *q2, int *q3){
if(*q1<*q2){
swap(q1,q2);
}
if(*q1<*q3){
swap(q1,q3);
}
if(*q2<*q3){
swap(q2,q3);
}
}
void swap(int *pt1, int *pt2){
int temp;
temp=*pt1;
*pt1=*pt2;
*pt2=temp;
}
3.使用以下三种方法输出数组的元素:
下标法:略
通过数组名计算数组元素地址,找出元素的值
用指针变量指向数组元素
#include <stdio.h>
void main()
{
int a[10]={
1,2,3,4,5,6,7,8,9,10};
int i;
for(i=0;i<10;i++){
printf("%d ", *(a+i));
}
}
#include <stdio.h>
void main()
{
int a[10]={
1,2,3,4,5,6,7,8,9,10};
int *p;
for(p=a;p<(a+10);p++){
printf("%d ", *p);
}
}
4.将数组a中n个整数按相反顺序存放(分别用数组名做参数和用指针做参数)
方法一: 数组名做参数
#include<stdio.h>
void reverse(int a[], int n);
void main()
{
int a[10]={
3,43,5,54,9,20,49,543,94,394};
int i;
int n=sizeof(a)/sizeof(a[0]);
printf("Original array is:");
for(i=0;i<10;i++){
printf("%-4d ", a[i]);
}
reverse(a,n);
printf("\nThe array has been reversed:");
for(i=0;i<10;i++){
printf("%-4d ", a[i]);
}
}
void reverse(int a[], int n){
int i,j,temp,middle;
middle=(n-1)/2;
for(i=0;i<=middle;i++){
j=n-1-i;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
方法二:指针做参数
#include<stdio.h>
void reverse(int *a, int n);
void main()
{
int a[10]={
3,43,5,54,9,20,49,543,94,394};
int i;
int n=sizeof(a)/sizeof(a[0]);
printf("Original array is:");
for(i=0;i<10;i++){
printf("%-4d ", a[i]);
}
reverse(a,n);
printf("\nThe array has been reversed:");
for(i=0;i<10;i++){
printf("%-4d ", a[i]);
}
}
void reverse(int *a, int n){
int *i,*j,*p,middle,temp;
middle=(n-1)/2;
i=a;//i指向数组的第一个元素
j=n-1+a;//j指向数组的最后一个元素
p=a+middle;//p指向中间值
for( ;i<=p;i++,j--){
temp=*i;
*i=*j;
*j=temp;
}
}
5.对数组中10个整数按由大到小的顺序排序
#include<stdio.h>
int main(){
int *p, i, a[10]={
2,12,43,222,49,58,232,4,594,90};
printf("The original array:\n");
for(i=0;i<10;i++){
printf("%3d ", a[i]);
}
p=a;
sort(p,10);
printf("\nAfter sort:\n");
for(i=0;i<10;i++){
printf("%3d ", a[i]);
}
return 0;
}
void sort(int x[], int n){
int i,j,t,k;
for(i=0;i<n-1;i++){
k=i;
for(j=i+1;j<n;j++){
if(x[j]>x[k]){
t=x[j];
x[j]=x[k];
x[k]=t;
}
}
}
}
6.用指针变量输出输出二维数组元素的值
tips:*(p+i)+j是二维数组i行j列的元素地址,而 *( *(p+i)+j)则是i行j列元素的值;
#include<stdio.h>
int main(){
int a[3][4]={
1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];
int i,j;
p=a;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("%2d ", *(*(p+i)+j));
}
}
return 0;
}
7.通过输入指定行数和列数打印出二维数组对应任一行任一列元素的值
#include<stdio.h>
int main(){
int a[3][4]={
1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];
int i,j;
p=a;
printf("i=");
scanf("%d", &i);
while(i<0||i>2){
printf("i=");
scanf("%d", &i);
}
printf("j=");
scanf("%d", &j);
while(j<0||j>3){
printf("j=");
scanf("%d", &j);
}
printf("a[%d,%d]=%d\n", i, j, *(*(p+i)+j));
return 0;
}
8.将字符串a复制为字符串b
方法一:下标法
#include<stdio.h>
int main(){
char a[]="It's Great!",b[50];
int i;
for(i=0;*(a+i)!='\0';i++){
*(b+i)=*(a+i);
}
*(b+i)='\0';
printf("String a is:%s\n", a);
printf("String b is:");
for(i=0;b[i]!='\0';i++){
printf("%c", b[i]);
}
return 0;
}
方法二:指针法
#include<stdio.h>
int main(){
char a[]="It's Great!",b[50],*p1,*p2;
p1=a;
p2=b;
int i;
for( ;*p1!='\0';p1++,p2++){
*p2=*p1;
}
*p2='\0';
printf("String a is:%s\n", a);
printf("String b is:");
for(i=0;b[i]!='\0';i++){
printf("%c", b[i]);
}
return 0;
}
9.用函数调用实现字符串的复制(用字符数组做参数;形参用字符指针变量)
方法一:字符数组做参数
#include<stdio.h>
void copy_string(char from[], char to[]);
int main(){
char a[]="I am a teacher!",b[]="You are a student!";
printf("String a is:%s\nString b is:%s\n", a, b);
printf("After exchange:\n");
copy_string(a,b);
printf("String a is:%s\nString b is:%s\n", a, b);
return 0;
}
void copy_string(char from[], char to[]){
int i=0;
for( ;from[i]!='\0';i++){
to[i]=from[i];
}
to[i]='\0';
}
方法二:形参用指针变量
#include<stdio.h>
void copy_string(char *from, char *to);
int main(){
//不能定义为:*b="You are a student!";
//为什么?尝试区别两者反汇编代码并理解其意义(内存中的五个区!)
char *a="I am a teacher!",b[]="You are a student!";
printf("String a is:%s\nString b is:%s\n", a, b);
printf("After exchange:\n");
copy_string(a,b);
printf("String a is:%s\nString b is:%s\n", a, b);
return 0;
}
void copy_string(char *from, char *to){
for( ;*from!='\0';from++,to++){
*to=*from;
}
*to='\0';
}
10.用指向函数的指针做函数参数 设计一个函数process,在调用它的时候,每次实现不同的功能。输入a和b两个数,第一次调用process时找出a和b中最大者,第二次找出其中最小者,第三次求两个数之和。
#include<stdio.h>
int max(int,int);
int min(int,int);
int add(int,int);
int process(int,int,int(*fun)());
int main(){
int a,b;
scanf("%d %d", &a, &b);
printf("max=");
process(a,b,max);
printf("min");
process(a,b,min);
printf("sum=");
process(a,b,add);
return 0;
}
int max(int x, int y){
return x>y?x:y;
}
int min(int x, int y){
return x<y?x:y;
}
int add(int x, int y){
return x+y;
}
int process(int x,int y,int(*fun)()){
int z;
if(fun==max){
z=max(x,y);
}
if(fun==min){
z=min(x,y);
}
if(fun==add){
z=add(x,y);
}
printf("%d\n", z);
}
11.将输入的大写字母转换为小写字母,输入的小写字母转换为大写字母。用位操作完成转换过程
tips:大写字母A的ASCII值是65,二进制是01000001,小写字母a的ASCII值是97,二进制是01100001,通过观察可知第5位是0的时候就是大写,1的时候就是小写(从0开始数),十进制32的二进制为00100000,233的二进制为11011111,255的二进制为11111111。
#include<stdio.h>
int main(){
char ch,temp;
printf("请输入一个字母:\n");
ch=getchar();
temp=getchar();
while(!(ch>'A'&&ch<'z') || (ch>'Z'&&ch<'a')){
printf("输入有误,请重新输入一个字母:\n");
ch=getchar();
}
if(ch&32){
ch=ch&223;//使第5位为0,变大写
}else{
ch=ch|255;//使第5位为1,变小写 有的编译器会提示数值溢出
}
putchar(ch);
printf("\n");
return 0;
}