zoukankan      html  css  js  c++  java
  • 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;

    }

  • 相关阅读:
    今日SGU 5.27
    今日SGU 5.26
    今日SGU 5.25
    软件工程总结作业
    个人作业——软件产品案例分析
    个人技术博客(α)
    结对作业二
    软工实践 二
    软工实践 一
    《面向对象程序设计》六 GUI
  • 原文地址:https://www.cnblogs.com/halflife/p/15570161.html
Copyright © 2011-2022 走看看