指针练习

/*
    输入3个数,从小大排列
*/
#include<stdio.h>
#include<stdlib.h>

int main(void)
{
    void daxiao(int *p,int n);

    printf("请输入3个数字:");
    int a[3];
    for(int i = 0; i < 3; i++)
    {
        scanf("%d",&a[i]);
        getchar();
    }
    
    daxiao(a,3);
    printf("从小到大排列:");
    for(int i = 0; i < 3; i++)
    {
        printf("%d ",a[i]);
    }

    return 0;
}

void daxiao(int *p,int n)
{
    int temp;
    for(int i = 0; i < (n-1); i++)
    {
        for(int j = i+1; j < n; j++)
        {
            if(p[i] > p[j])
            {
                temp = p[i];
                p[i] = p[j];
                p[j] = temp;
            }
        }
    }
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/*
    输入3个字符串,从小大排列,和数字有很大区别
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void)
{
    void daxiao(char *x,char *y);

    char a[10],b[10],c[10];

    gets(a);
    gets(b);
    gets(c);

    if(strcmp(a,b) > 0)  daxiao(a,b);
    if(strcmp(b,c) > 0)  daxiao(b,c);
    if(strcmp(a,c) > 0)  daxiao(a,c);

    printf("%s %s %s",a,b,c);

}

void daxiao(char *x,char *y)
{
    char z[10];
    strcpy(z , x);
    strcpy(x , y);
    strcpy(y , z);
}
--------------------------------------------------------------------------------------------------------------------------------
/*
    输入10个数字
    把最小的跟第一个互换,最大的跟最后一个互换
    打印数字
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void)
{
    void shuru(int *p);
    void shuchu(int *p);
    void caozuo(int *p);

    int *p;
    int num[10];
    p = num;
    shuru(p);
    caozuo(p);
    shuchu(p);
    
    return 0;
}

void shuru(int *p)
{

    for(int i = 0; i < 10; i++)
    {
        scanf("%d",&p[i]);
        getchar();
    }
    
}

void shuchu(int *p)
{
    for(int i = 0; i < 10; i++)
    {
        printf("%d,",p[i]);
    }
    
}

void caozuo(int *p)
{
    int *max = p;
    int *min = p;
    int temp;
    for(int i = 1; i < 10; i++)
    {
        if(*max < p[i]) max = &p[i];    
    }
    for(int i = 1; i < 10; i++)
    {
        if(*min > p[i]) min = &p[i];    
    }
    temp = p[0];
    p[0] = *min;
    *min = temp;

    temp = p[9];
    p[9] = *max;
    *max = temp;

}
------------------------------------------------------------------------------------------------------------------------
/*
    有n个整数,使前面各数顺序向后移动m个位置,最后m个数变成前面的m个数,
    写一函数实现以上功能,在主函数中输入n个整数和输出调正后的n个数
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void)
{
    void tiaozheng(int *p,int *p1,int n,int m);
    int n,m;
    int *p,*p1;

    printf("请输入你要输入的数字的个数:");
    scanf("%d",&n);
    getchar();

    printf("请输入要调整的数字的个数:");
    scanf("%d",&m);
    getchar();

    p = (int *)malloc(sizeof(int) * n);
    p1 = (int *)malloc(sizeof(int) * n);

    for(int i = 0; i < n; i++)
    {
        scanf("%d",&p[i]);
        getchar();
    }

    tiaozheng(p,p1,n,m);

    for(int i = 0; i < n; i++)
    {
        printf("%d ",p1[i]);
    }

    free(p);
    free(p1);
    return 0;
}

void tiaozheng(int *p,int *p1,int n,int m)
{
    for(int i = 0;i < n; i++)
    {
        if(i < m)
            p1[i] = p[n-m+i];
        else
            p1[i] = p[i-m];
    }
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/*
    有n个人围城一圈,顺序排号,从第一个人开始报数,从1到3报数,
    凡报到3的人出局,问最后剩下的是原来的第几号
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void)
{
    int *jiajia(int *p,int *p_end,int n);       //声明函数

    int n;
    printf("有几个人参加游戏:");
    scanf("%d",&n);                     //参加游戏的人数
    getchar();

    int a[n];
    for(int i = 1; i<=n; i++)          //从1开始排列游戏人数
        a[i-1] = i;

    int *p = a;
    int count = n;                  //计数器
    int *p_end;                     //最后一个元素的地址
    p_end = p + n - 1;

    while(count > 1)
    {
        p = jiajia(p,p_end,n);          //开始数
        p = jiajia(p,p_end,n);
        p = jiajia(p,p_end,n);

        while (*p == 0)                 //当碰到已经出局的人,往下移一位
        {
            p = jiajia(p,p_end,n);
        }
     
        *p = 0;                         //点到的人出局
        count -= 1;                     //出局一人计数器减一
        
        for(int i = 0; i < n; i++)      //这三行是用来核对答案用的
            printf("%d",a[i]);
        printf(" ");
    }
    for(int i = 0; i < n; i++)
    {
         if(a[i]!= 0)
             printf("最后留下的时原来的%d号",a[i]);
        //printf("%d ",a[i]);
    }
       
    return 0;
}

int *jiajia(int *p,int *p_end,int n)        //移动指针用的函数
{
    if (p == p_end)             //当指针指到最后一位,就从第一位开始
    {
        p = p - (n-1);
    }    
    else
    {
        p++;                    //不是最后一位就往后移
    }
    return p;
}

--------------------------------------------------------------------------------------------------------------
 
/*
    写一个函数,求字符串长度
*/
#include<stdio.h>

int stringlen(char *p)
{
    int count = 0;
    while (*p != '')
    {
        p++;
        count += 1;
    }
    return count;
}

int main(void)
{
    printf("请输入一个字符串: ");
    char s[20];          //字符数组,都可以表示字符串,但是还是有很多区别
    //char *s;          //字符指针变量,不能用scanf赋值,因为他是指向字符串的首字符
   
    /* 这样也就可以使用scanf输入,字符串指针变量指向字符串的首字母地址
    char *a;
    a = s;
    scanf("%s",a);
    */

    scanf("%s",s);
    getchar();
    printf("%s",s);

    printf("字符串长度是:%d",stringlen(s));

    return 0;
}
 
--------------------------------------------------------------------------------------------------------
 
 
 
原文地址:https://www.cnblogs.com/hemage/p/13262704.html