C Primer Plus第十章指针课后编程练习,自己分析

第十章指针和数组,课后编程题@TOC

第二题,数组赋值:用两种方式将source[]数组中的值复制到target[]数组中。
代码如下:

#include<stdio.h>

void copy_arr(double [], double [], int);
void copy_ptr(double [], double [], int);
void print(double [], int);

int main()
{
    int LEN = 5;
    double source[] = {1.1, 2.2, 3.3, 4.4, 5.5};
    double target1[LEN];
    double target2[LEN];
    copy_arr(source,target1,LEN);
    print(target1,LEN);
    copy_ptr(source,target2,LEN);
    print(target2,LEN);
    return 0;
}

void copy_arr(double source[], double target[], int NUM)
{
    int i;
    for(i = 0; i < NUM; ++i)
    {
        target[i] = source[i];
    }
}

void copy_ptr(double source[], double target[], int NUM)
{
    double *ptr;
    ptr = target;
    for (int i = 0; i < NUM; ++i)
    {
        *ptr = source[i];
        ptr++;
    }
}

void print(double arr[], int LEN)
{
    for (int i = 0; i < LEN; ++i)
    {
        printf("%f ",arr[i]);
    }
    printf("\n");
}

这道题还是很简单的,但是我在写代码的过程中发现一个问题,就是*ptr = source[i]等价于&*ptr = &source[i]即ptr = &source[i],但是这么写出来运行的结果却是错误的,结果如下图:
在这里插入图片描述
查看结果发现target2数组的值全为0,并没有被赋值,这是为什么呢?我分别打印了source[]数组和target2[]数组的地址和指针的地址查看原因。


```c
void copy_ptr(double source[], double target[], int NUM)
{
    double *ptr;
    ptr = target;
    for (int i = 0; i < NUM; ++i)
    {
        printf("%p ",ptr);
        //*ptr = source[i];
        ptr = &source[i];
        printf("%f ",source[i]);
        printf("%p ",&source[i]);
        printf("%p ",ptr);
        printf("%f ",target[i]);
        ptr++;
        printf("\n");
    }
    printf("\n");
}

在这里插入图片描述
从上图可以看到,指针ptr的地址发生了变动,从指向target2数组的首元素变成了指向source数组的首元素,也就是说ptr++实际上是在遍历source数组,target数组并未被赋值。
再来看正确结果的地址:

void copy_ptr(double source[], double target[], int NUM)
{
    double *ptr;
    ptr = target;
    for (int i = 0; i < NUM; ++i)
    {
        printf("%p ",ptr);
        *ptr = source[i];
        //ptr = &source[i];
        printf("%f ",source[i]);
        printf("%p ",&source[i]);
        printf("%p ",ptr);
        printf("%f ",target[i]);
        ptr++;
        printf("\n");
    }
    printf("\n");
}

在这里插入图片描述
正确的情况下,指针ptr指向target数组。所以ptr=&source[]这个操作改变了ptr的指向地址,从而发生了错误。
``

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值