鱼C论坛

 找回密码
 立即注册
查看: 2435|回复: 12

[已解决]三种方式打印数组疑问

[复制链接]
发表于 2017-11-1 10:37:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 小蒙 于 2017-11-1 10:37 编辑
#include <stdio.h>
#include <ctype.h>

void pp(double *p, int num);

void copy_arr(double target[], double source[], int num);

void copy_ptr(double *target, double *source, int num);

void copy_ptrs(double *target, double *start, double *end);

int main(void) {
    double source[5] = {1.1, 2.2, 3.3, 4.4, 5.5};
    double target2[5];
    double target3[5];
    double target4[5];
//    for (int i = 0; i < 5; ++i) {
//        printf("%p\n", &target4[i]);
//    }

    copy_arr(target2, source, 5);
    copy_ptr(target3, source, 5);
    copy_ptrs(target4, source, source + 5);
    printf("target2:");
    pp(target2, 5);
    printf("target3:");
    pp(target3, 5);
    printf("target4:");
    pp(target4, 5);
    return 0;
}

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

void copy_ptr(double *target, double *source, int num) {
    for (int i = 0; i < num; ++i) {
        *target++ = *(source + i);
    }
}

void copy_ptrs(double *target, double *start, double *end) {
    for (; target < end;) {
        *target++ = *start++;
    }
}

void pp(double *p, int num) {
    for (int i = 0; i < num; ++i) {
        printf("%.1f ", *p++);
    }
    putchar('\n');
}
如图打印结果是 屏幕快照 2017-11-01 10.34.57.png

如果注释掉其他两条函数调用只打印任意一个函数,结果就是对的。
最佳答案
2017-11-1 12:30:15
本帖最后由 橙C 于 2017-11-1 12:31 编辑
小蒙 发表于 2017-11-1 12:23
我刚才打印看了,source确实被改变了,不懂……


改成这样..就符合你的要求..

void copy_ptrs(double *target, double *start, double *end) {
    for (; start< end;) {
        *target++ = *start++;
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-1 11:00:03 | 显示全部楼层
*target++ = *start++;
这一句改变原数组的指向,所以前面两个target的内容也被更换了,
请用一个临时指针进行操作,或者在循环结束后加一句 start -= count;//count 是循环计数值

另外,printf("%.1f ", *p++);
也会改变原来的数组指向,在循环后要加上 p -= num
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-1 11:17:56 | 显示全部楼层
使用VS2008运行该函数

void copy_ptrs(double *target, double *start, double *end) {
    for (; target < end;) {
        *target++ = *start++;
    }
}
=========================================
double source[5] = {1.1, 2.2, 3.3, 4.4, 5.5};  假设地址: 0x2afa70
    double target2[5];     假设地址: 0x2afa40
    double target3[5];    假设地址: 0x2afa10
    double target4[5];   假设地址: 0x2af9e0
========================================
该函数会赋值
0x2af9e0 到 0x2afa98 的内存块....
也就是就说 source, target2, target3, target4数组所有值都改变了..
还改变了其他的内存块..source之前的40个字节内存..
我比较好奇的是..竟然没有崩溃~

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-1 11:46:14 | 显示全部楼层
BngThea 发表于 2017-11-1 11:00
*target++ = *start++;
这一句改变原数组的指向,所以前面两个target的内容也被更换了,
请用一个临时指 ...

不理解,我全程操作的是指向数组的指针,指针给数组元素赋值,指针是改变了,但是数组本身的地址(即数组首元素的地址)是常数,函数怎么还能改变数组的指向呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-1 11:49:37 | 显示全部楼层
小蒙 发表于 2017-11-1 11:46
不理解,我全程操作的是指向数组的指针,指针给数组元素赋值,指针是改变了,但是数组本身的地址(即数组 ...

你将一个数组名作为指针传递到函数中,然后对这个指针进行了自增运算,你说它变了没有?

你若不信的话,可以写个小程序查看一下地址是否有变化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-1 12:04:44 | 显示全部楼层
本帖最后由 小蒙 于 2017-11-1 12:06 编辑
BngThea 发表于 2017-11-1 11:49
你将一个数组名作为指针传递到函数中,然后对这个指针进行了自增运算,你说它变了没有?

你若不信的话 ...

    double source[5] = {1.1, 2.2, 3.3, 4.4, 5.5};
    printf("before:");
    printf("%p\n", source);
    change(source);
    printf("after: ");
    printf("%p\n", source);
    return 0;
}

void change(double *source) {
    source++;
}
屏幕快照 2017-11-01 12.04.10.png
但是代码中提示:
屏幕快照 2017-11-01 12.05.52.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-1 12:21:31 | 显示全部楼层
小蒙 发表于 2017-11-1 12:04
但是代码中提示:


你随便操作一下
double a = *source++;
printf("%lf",&a);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-1 12:23:01 From FishC Mobile | 显示全部楼层
橙C 发表于 2017-11-1 11:17
使用VS2008运行该函数

void copy_ptrs(double *target, double *start, double *end) {

我刚才打印看了,source确实被改变了,不懂……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-1 12:30:15 | 显示全部楼层    本楼为最佳答案   
本帖最后由 橙C 于 2017-11-1 12:31 编辑
小蒙 发表于 2017-11-1 12:23
我刚才打印看了,source确实被改变了,不懂……


改成这样..就符合你的要求..

void copy_ptrs(double *target, double *start, double *end) {
    for (; start< end;) {
        *target++ = *start++;
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-1 13:00:23 | 显示全部楼层
BngThea 发表于 2017-11-1 12:21
你随便操作一下


                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-1 13:07:03 | 显示全部楼层
橙C 发表于 2017-11-1 12:30
改成这样..就符合你的要求..

void copy_ptrs(double *target, double *start, double *end) {

我怎么感觉跟我的代码一样呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-1 13:07:50 | 显示全部楼层
小蒙 发表于 2017-11-1 13:07
我怎么感觉跟我的代码一样呢

写程序..不认真的话..什么都是错的..在仔细看看...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-1 13:31:34 | 显示全部楼层
橙C 发表于 2017-11-1 13:07
写程序..不认真的话..什么都是错的..在仔细看看...

target和end根本就是两个东西,多谢多谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-30 23:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表