例8-1 利用指针模拟密码开锁游戏。
#include<stdio.h>
int main(void)
{
int x=5342; //变量x用于存放密码值
int *p=NULL;
p=&x;
printf("If I know the name of the variable,\
I can get it's value by name:%d\n",x);
printf("If I know the address of the variable "
"is:%x,then I also can get it's value by address:%d\n",p,*p);
return 0;
}
注:printf换行的2种方式:\和””
例8-2 取地址运算和间接访问运算示例。
#include<stdio.h>
int main(void)
{
int a=3,*p,x;
p=&a;
printf("a=%d,*p=%d\n",a,*p);
*p=10;
printf("a=%d,*p=%d\n",a,*p);
printf("Enter a:");
//scanf("%d",&a);
printf("a=%d,*p=%d\n",a,*p);
(*p)++;
printf("*a=%d,*p=%d\n",a,*p);
x=*p++;
printf("*a=%d,x=%d,*p=%d\n",a,x,*p);
printf("&a=%x,p=%x\n",&a,p);
return 0;
}
例8-3 角色互换。有两个角色分别用变量a和b表示。为了实现角色互换,现制定了3套方案,通过函数调用来交换变量a和b的值,即swap1()、swap2()和swap3()。请分析这3个函数中,哪个函数可以实现这样的功能。
#include<stdio.h>
void swap1(int x,int y),swap2(int *px,int *py),swap3(int *px,int *py);
int main(void)
{
int a=1,b=2;
int *pa=&a,*pb=&b;
swap1(a,b);
printf("After calling swap1:a=%d b=%d\n",a,b);
a=1;b=2;
swap2(pa,pb);
printf("Afer calling swap2:a=%d b=%d\n",a,b);
a=1;b=2;
swap3(pa,pb);
printf("After calling swap3:a=%d b=%d\n",a,b);
return 0;
}
void swap1(int x,int y)
{
int t;
t=x;
x=y;
y=t;
}
void swap2(int *px,int *py)
{
int t;
t=*px;
*px=*py;
*py=t;
}
void swap3(int *px,int *py)
{
int *pt;
pt=px;
px=py;
py=pt;
}
例8-4 输入年份和天数,输出对应的年、月、日。要求定义和调用函数month_day(int year,int yearday,int *pmonth,int *pday),其中year是年,yearday是天数,pmonth和pday指向变量保存计算得出的月和日。例如,输入2000和61,输出2000-3-1,即2000年的第61天是3月1日。
#include<stdio.h>
void month_day(int year,int yearday,int *pmonth,int *pday);
int main(void)
{
int day,month,year,yearday;
printf("input year and yearday:");
scanf("%d%d",&year,&yearday);
month_day(year,yearday,&month,&day);
printf("%d-%d-%d\n",year,month,day);
return 0;
}
void month_day(int year,int yearday,int *pmonth,int *pday)
{
int k,leap;
int tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}};
leap=(year%4==0 && year%100 !=0 )||year%400==0;
for(k=1;yearday>tab[leap][k];k++)
{
yearday-=tab[leap][k];
}
*pmonth=k;
*pday=yearday;
}
例8-5 冒泡排序。输入n(n10)个正整数,将它们从小到大排序后输出,要求使用冒泡排序算法。
#include<stdio.h>
#define MAXN 10
void swap(int *px,int *py);
void bubble(int a[],int n);
int main(void)
{
int n,a[MAXN];
int i;
printf("Enter n(n<=10):");
scanf("%d",&n);
printf("Enter %d integers:",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
bubble(a,n);
printf("After sorted:");
for(i=0;i<n;i++)
{
printf("%3d",a[i]);
}
return 0;
}
void bubble(int a[],int n)
{
int i,j,t;
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(a[j]>=a[j+1])
{
swap(&a[j],&a[j+1]);
}
}
}
}
void swap(int *px,int *py)
{
int t;
t=*px;
*px=*py;
*py=t;
}
例8-6 输入正整数n(n),再输入n个整数作为数组元素,分别使用数组和指针来计算输出它们的和。
#include<stdio.h>
int main(void)
{
int i,n,a[10],*p;
long sum=0;
printf("Enter n(n<=10):");
scanf("%d",&n);
printf("Enter %d integers:",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
sum=sum+*(a+i);
}
printf("calculated by array,sum=%ld\n",sum);
sum=0;
for(p=a;p<a+n;p++)
{
sum=sum+*p;
}
printf("calculated by pointer,sum=%ld\n",sum);
return 0;
}
例8-7 使用指针计算数组元素个数和数组元素的存储单元数。
#include<stdio.h>
int main(void)
{
double a[2],*p,*q;
p=&a[0];
q=p+1;
printf("%d\n",q-p);
printf("%d\n",(int)q-(int)p);
return 0;
}
例8-8 输入一个长度小于80的字符串,按规则对字符串进行压缩,输出压缩后的字符串。压缩规则是:如果某个字符x连续出现n(n1)个,则将这n个字符替换为“nx”的形式;否则保持不变。
#include<stdio.h>
#define MAXLINE 80
void zip(char *p);
int main(void)
{
char line[MAXLINE];
printf("Input the string:");
gets(line);
zip(line);
puts(line);
return 0;
}
void zip(char *p)
{
char *q=p;
int n;
while(*p!='\0')
{
n=1;
while(*p==*(p+n))
{
n++;
}
if(n>=10)
{
*q++=(n/10)+'0';
*q++=(n%10)+'0';
}
else if(n>=2)
{
*q++=n+'0';
}
*q++=*(p+n-1);
p=p+n;
}
*q='\0';
}
例8-9 找最小的字符串。输入n歌字符串,输出其中最小的字符串。
#include<stdio.h>
/*
#include<string.h>
int main(void)
{
int i,n;
char sx[80],smin[80];
scanf("%d",&n);
scanf("%s",sx);
strcpy(smin,sx);
for(i=1;i<n;i++)
{
scanf("%s",sx);
if(strcmp(sx,smin)<0)
{
strcpy(smin,sx);
}
}
printf("min is %s\n",smin);
return 0;
}*/
int main(void)
{
int i,n;
int x,min;
scanf("%d",&n);
scanf("%d",&x);
min=x;
for(i=1;i<n;i++)
{
scanf("%d",&x);
if(x<min)
{
min=x;
}
}
printf("min is %d\n",min);
return 0;
}
例8-10 先输入一个正整数n,再输入任意n个整数,计算并输出这n个整数的和。要求使用动态内存分配方法为这n个整数分配空间。
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int n,sum,i,*p;
printf("Enter n:");
scanf("%d",&n);
if((p=(int *)calloc(n,sizeof(int)))==NULL)
{
printf("Not able to allocate memory.\n");
exit(1);
}
printf("Enter %d integers:",n);
for(i=0;i<n;i++)
{
scanf("%d",p+i);
}
sum=0;
for(i=0;i<n;i++)
{
sum=sum+*(p+i);
}
printf("The sum is %d\n",sum);
free(p);
return 0;
}