《明解C语言》示例代码和练习代码[第10章]

第10章 指针


示例代码:


示例代码10-1
/*
    计算两个整数的和与差(误例) 
*/

#include <stdio.h>

// 将n1和n2的和、差分别保存至sum、diff(误例)
void sum_diff(int n1, int n2, int sum, int diff)
{
     sum = n1 + n2;
     diff = (n1 > n2) ? n1 - n2 : n2 - n1;
} 

int main(void)
{
    int na, nb;
    int wa = 0, sa = 0;
    
    puts("请输入两个整数。");
    printf("整数A:");    scanf("%d", &na); 
    printf("整数B:");    scanf("%d", &nb); 
    
    sum_diff(na, nb, wa, sa);
    
    printf("两数之和是%d。\n两数之差是%d。\n", wa, sa);
    
    return (0);  
}

示例代码10-2
/*
    显示对象的地址 
*/

#include <stdio.h>

int main(void)
{
    int nx;
    double dx;
    int vc[3];
    
    printf("nx    的地址:%p\n", &nx);
    printf("dx    的地址:%p\n", &dx); 
    printf("vc[0] 的地址:%p\n", &vc[0]);
    printf("vc[1] 的地址:%p\n", &vc[1]);
    printf("vc[2] 的地址:%p\n", &vc[2]); 

    return (0);  
}

示例代码10-3
/*
    通过指针间接地操作身高 
*/

#include <stdio.h>

int main(void)
{
    int sato = 178;            // 佐藤的身高 
    int sanaka = 175;          // 佐中的身高 
    int hiraki = 165;          // 平木的身高 
    int masaki = 179;          // 真崎的身高 
    
    int *isako, *hiroko;
    
    isako = &sato;             // isako指向sato(喜欢佐藤) 
    hiroko = &masaki;          // hiroko指向masaki(喜欢真崎) 
    
    printf("伊沙子喜欢的人的身高:%d\n", *isako);
    printf("洋子喜欢的人的身高:%d\n", *hiroko);  
    
    isako = &sanaka;           // isako指向sanaka(移情别恋)      
    
    *hiroko = 180;             // 将hiroko指向的对象赋为180
                               // 修改洋子喜欢的人的身高
    putchar('\n');
    printf("佐藤的身高:%d\n", sato); 
    printf("佐中的身高:%d\n", sanaka); 
    printf("平木的身高:%d\n", hiraki); 
    printf("真崎的身高:%d\n", masaki);
    printf("伊沙子喜欢的人的身高:%d\n", *isako);
    printf("洋子喜欢的人的身高:%d\n", *hiroko);

    return (0);
}

示例代码10-4
/*
    函数的参数和指针 
*/

#include <stdio.h>

// 洋子(让身高不到180cm的人长到180cm) 
void hiroko(int *height)
{
    if (*height < 180)
        *height = 180;     
}

int main(void)
{
    int sato = 178;            // 佐藤的身高 
    int sanaka = 175;          // 佐中的身高 
    int hiraki = 165;          // 平木的身高 
    int masaki = 179;          // 真崎的身高
    
    hiroko(&masaki);
    
    printf("佐藤的身高:%d\n", sato); 
    printf("佐中的身高:%d\n", sanaka); 
    printf("平木的身高:%d\n", hiraki); 
    printf("真崎的身高:%d\n", masaki);

    return (0);   
}

示例代码10-5
/*
    将两个整数值互换 
*/

#include <stdio.h>

// 将nx、ny指向的对象的值进行互换
void swap(int *nx, int *ny)
{
    int temp = *nx;
    *nx = *ny;
    *ny = temp;     
} 

int main(void)
{
    int na, nb;
    
    puts("请输入两个整数。");
    printf("整数A:");    scanf("%d", &na);
    printf("整数B:");    scanf("%d", &nb);
    
    swap(&na, &nb);
    
    puts("互换了两个数的值。");
    printf("整数A是%d。\n", na);
    printf("整数B是%d。\n", nb);
    return (0);
}

示例代码10-6
/*
    将两个整数进行互换(c++的引用传递)
    在c编译器中不能运行 
*/

#include <stdio.h>

// 将nx、ny所指对象的值进行互换
void swap(int *nx, int *ny)
{
    int temp = *nx;
    *nx = *ny;
    *ny = temp;     
} 

int main(void)
{
    int na, nb;
    
    puts("请输入两个整数。");
    printf("整数A:");    scanf("%d", &na);
    printf("整数B:");    scanf("%d", &nb);
    
    swap(na, nb);
    
    puts("互换了两个数的值。");
    printf("整数A是%d。\n", na);
    printf("整数B是%d。\n", nb);

    return (0);    
}

示例代码10-7
/*
    计算两个整数的和与差
*/

#include <stdio.h>

// 将n1和n2的和、差分别保存至sum、diff(误例)
void sum_diff(int n1, int n2, int *sum, int *diff)
{
     *sum = n1 + n2;
     *diff = (n1 > n2) ? n1 - n2 : n2 - n1;
} 

int main(void)
{
    int na, nb;
    int wa = 0, sa = 0;
    
    puts("请输入两个整数。");
    printf("整数A:");    scanf("%d", &na); 
    printf("整数B:");    scanf("%d", &nb); 
    
    sum_diff(na, nb, &wa, &sa);
    
    printf("两数之和是%d。\n两数之差是%d。\n", wa, sa);
    
    return (0);  
}

示例代码10-8
/*
    将两个整数升序排列 
*/

#include <stdio.h>

// 将nx、ny所指对象的值进行互换
void swap(int *nx, int *ny)
{
    int temp = *nx;
    *nx = *ny;
    *ny = temp;     
} 

// 排列顺序为*n1<=*n2
void sort2(int *n1, int *n2)
{
    if (*n1 > *n2)
        swap(n1, n2);     
} 

int main(void)
{
    int na, nb;
    
    puts("请输入两个整数。");
    printf("整数A:");    scanf("%d", &na); 
    printf("整数B:");    scanf("%d", &nb); 
    
    sort2(&na, &nb);
    
    puts("将两数的值按升序排列。");
    printf("整数A是%d。\n", na); 
    printf("整数B是%d。\n", nb);
    
    return (0);  
}

示例代码10-9
/*
    将两个实数值进行互换(误例) 
*/

#include <stdio.h>

// 将nx、ny所指对象的值进行互换
void swap(int *nx, int *ny)
{
    int temp = *nx;
    *nx = *ny;
    *ny = temp;     
} 

int main(void)
{
    double dx, dy;
    
    puts("请输入两个整数。");
    printf("实数X:");    scanf("%lf", &dx); 
    printf("实数Y:");    scanf("%lf", &dy); 
    
    swap(&dx, &dy);
    
    puts("互换了两数的值。");
    printf("实数A是%lf。\n", dx); 
    printf("实数B是%lf。\n", dy);
    
    return (0);  
}

示例代码10-10
/*
    数组和指针 
*/

#include <stdio.h>

int main(void)
{
    int i;
    int vc[5] = {10, 20, 30, 40, 50};
    int *ptr = &vc[0];
    
    for (i = 0; i < 5; i++)
        printf("vc[%d] = %d    ptr[%d] = %d   *(ptr + %d) = %d\n", i, vc[i], i, ptr[i], i, *(ptr + i));
        
    return (0);  
}

示例代码10-11
/*
    确认不带下标运算符的数组名的值(指向第一个元素的指针) 
*/

#include <stdio.h>

int main(void)
{
    int vc[3];
    
    printf("vc         :%p\n", vc);
    printf("vc[0]的地址:%p\n", &vc[0]);
    printf("vc[1]的地址:%p\n", &vc[1]);
    printf("vc[2]的地址:%p\n", &vc[2]); 
    
    return (0);   
}

示例代码10-12
/*
    指针的比较 
*/

#include <stdio.h>

int main(void)
{
    int vc[3];
    int *ptr = vc;
    
    printf("vc     ==  ptr   : %d\n", vc == ptr); 
    printf("&vc[1] <= &vc[1] : %d\n", &vc[1] <= &vc[1]);
    printf("&vc[1] <  &vc[2] : %d\n", &vc[1] <  &vc[2]); 
    printf("&vc[2] -  &vc[0] : %d\n", &vc[2] -  &vc[0]);
    
    return (0);    
}

示例代码10-13
/*
    数组的传递 
*/

#include <stdio.h>

void int_set(int vc[], int no, int val)
{
    int i;
    
    for (i = 0; i < no; i++)
        vc[i] = val;     
}

int main(void)
{
    int i;
    int ary[] = {1, 2, 3, 4, 5};
    
    int_set(ary, 5, 0);
    
    for (i = 0; i < 5; i++)
        printf("ary[%d] = %d\n", i, ary[i]);
    return (0);    
}


练习代码:

练习代码e10-1
/*
    编写如下函数,求出并设置y年m月d日的前一天或后一天的日期(能正确判断闰年)   
*/

#include <stdio.h>

// 判断闰年
int is_leap(int year)
{
    int i = 0;
    
    if (((year % 4) == 0 && (year % 100) != 0) || (year % 400 == 0))
        i = 1;
    return (i);
}

// 返回当月天数
int days(int year, int month)
{
    int i;
    
    switch (month) {
        case 4:
        case 6:
        case 9:
        case 11: i = 30; break; 
        case 2: if (is_leap(year)) i = 29; else i = 28; break;
        default: i = 31; break;
    }
    return (i);
}
 
// 求出前一天
void yesterday(int *y, int *m, int *d)
{   
    (*d)--;
    
    if (!(*d)) {
        (*d) = days(*y, --(*m));
    }
    
    if (!(*m)) {
        (*y)--;
        (*m) = 12; 
    }   
} 

// 求出后一天
void tomorrow(int *y, int *m, int *d)
{
    (*d)++;
    
    if ((*d) > days(*y, *m)) {
        (*d) = 1;
        (*m)++;       
    }
    
    if ((*m) > 12) {
        (*y)++;
        (*m) = 1;
    } 
         
}

int main(void)
{
    int year, month, day;
    printf("请输入年月日: ");
    scanf("%d%d%d", &year, &month, &day);
    putchar('\n');
    
    yesterday(&year, &month, &day);
    printf("前一天:%d %2d %2d\n", year, month, day);
    tomorrow(&year, &month, &day);
    printf("输入日:%d %2d %2d\n", year, month, day);
    tomorrow(&year, &month, &day);
    printf("后一天:%d %2d %2d\n", year, month, day);
    
    return (0); 
}

练习代码e10-2
/*
    编写如下函数,将三个int型整数按升序排列。 
*/

#include <stdio.h>

// 2个整数交换
void swap(int *a, int *b)
{
     int t;
     t = *a;
     *a = *b;
     *b = t;
} 

// 排序3个整数 
void sort3(int *n1, int *n2, int *n3)
{
    if (*n1 > *n2)
        swap(n1, n2);
       
    if (*n1 > *n3)
        swap(n1, n3);
        
    if (*n2 > *n3)
        swap(n2, n3);   
}

int main(void)
{
    int x, y, z;
    printf("请输入三个整数:");
    scanf("%d%d%d", &x, &y, &z);
    
    sort3(&x, &y, &z);
    printf("排序后:%d  %d  %d\n", x, y, z);
    
    return (0);    
}
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值