C语言程序设计笔记7指针

C语言程序设计-笔记7-指针

例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;

}

原文地址:https://www.cnblogs.com/halflife/p/15570161.html