| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1026 人关注过本帖
标题:关于指针,函数,数组的程序
只看楼主 加入收藏
hanxiaokun
Rank: 2
等 级:论坛游民
帖 子:44
专家分:56
注 册:2011-8-31
结帖率:75%
收藏
已结贴  问题点数:20 回复次数:21 
关于指针,函数,数组的程序
/*
    目的:将指定范围元素复制到指定数组中。
*/

#include

void copy_ptr(double *,double *,int);
int main(void)
{
    double source[8]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8};
    double target[3];//目标函数
    //int i;
    copy_ptr(&source[2],target,3);//把源数组的第3-5个元素复制到target。传递第三个元素的地址,目标函数的地址,以及复制元素数目
    return 0;
}


void copy_ptr(double *source,double * target,int n)
{
    int i;
    for(i=0;i<N;I++)
        *target++=*source++;
    for(i=0;i<3;i++)
        printf("%.2lf ",*target++);
    putchar('\n');
        
}
执行结果不是从source[2]开始复制,而是从头复制。
这事另外个朋友发表的,但由于标题不吸引人,很少有高手进来
希望那位高手能给个这个程序错误的原因,和在此种错误的情况下为什么会输出这种结果的原因
各位兄弟,我知道这个程序是输出越界造成的结果,也知道怎么改正,关键是这个程序在这种越界的情况下为什么
会转从source数组的开头开始输出


[ 本帖最后由 hanxiaokun 于 2011-9-9 08:56 编辑 ]
搜索更多相关主题的帖子: 函数 void double return source 
2011-09-08 17:09
tisyang
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:132
专家分:737
注 册:2011-5-7
收藏
得分:0 
稍等。。

C++ 用无参数构造函数生成对象时候请勿在构造函数后添加无用的那一对括号,否则有可能会被当成函数声明而忽略,嗯,栈上构建的时候就是这样。
2011-09-08 17:27
A13433758072
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广东潮州
等 级:小飞侠
威 望:1
帖 子:1182
专家分:2784
注 册:2010-7-22
收藏
得分:0 
for(i=0;i<N;I++)看下这代码

[ 本帖最后由 A13433758072 于 2011-9-8 17:43 编辑 ]

一步一个脚印...............................默默地前进.....
诚邀乐于解答c菜鸟问题,的热心网友加入,  QQ群38490319
2011-09-08 17:38
tisyang
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:132
专家分:737
注 册:2011-5-7
收藏
得分:0 
 
for(i =0; i< 3; i++)
    printf("%.2lf ", target[i]);

这样输出说明是正确的。
复制是复制成功了,但是你的打印函数有问题,*不应该*去依赖 printf这个函数的执行顺序,不知道你懂了没有。

C++ 用无参数构造函数生成对象时候请勿在构造函数后添加无用的那一对括号,否则有可能会被当成函数声明而忽略,嗯,栈上构建的时候就是这样。
2011-09-08 17:43
tisyang
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:132
专家分:737
注 册:2011-5-7
收藏
得分:2 

 for(i=0;i<3;i++)
        printf("%.2lf ",*target++);

printf 的函数执行顺序不是你想要的,是不可以预测的。。。。。。。
程序代码:
#include <stdio.h>

void copy_ptr(double *,double *,int);
int main(void)
{
  double source[8]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8};
  double target[3] = { 0.0, 0.0, 0.0};
  //int i;
  copy_ptr(&source[2],target,3);
  return 0;
}


void copy_ptr(double *source,double * target,int n)
{
  int i;

  for(i=0;i<n;i++)
    *target++ = *source++;

  for(i=0;i<3;i++)
    printf("%.2lf ",*target++);
  putchar('\n');


  for(i =0; i< 3; i++)
    printf("%.2lf ", target[i]);
  puts("");
  
        
}

输出:
4.40 5.50 6.60

C++ 用无参数构造函数生成对象时候请勿在构造函数后添加无用的那一对括号,否则有可能会被当成函数声明而忽略,嗯,栈上构建的时候就是这样。
2011-09-08 17:45
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:0 
*target++=*source++;
类似的语句可以拆开,程序可能更加容易理解

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2011-09-08 18:02
A13433758072
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广东潮州
等 级:小飞侠
威 望:1
帖 子:1182
专家分:2784
注 册:2010-7-22
收藏
得分:2 
回复 4楼 tisyang
幸亏我有经常,回来看,问题的习惯…不然悲剧了 你的下标,越界了 for (i= 0 ;i< 3 ;i++)
    printf( " %.2lf " ,*target++);
  putchar( ' \n ' );
for (i = 0 ; i< 3 ; i++)
    printf( " %.2lf " , target[i]);
  puts( "" );
} 因为 *target++=*source++;指针的位置是target[2]而后面的       printf("%.2lf",*target++);
  输出的是数组以外内存地址,所以越界

一步一个脚印...............................默默地前进.....
诚邀乐于解答c菜鸟问题,的热心网友加入,  QQ群38490319
2011-09-08 18:19
tisyang
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:132
专家分:737
注 册:2011-5-7
收藏
得分:2 
以下是引用A13433758072在2011-9-8 18:19:08的发言:

幸亏我有经常,回来看,问题的习惯…不然悲剧了 你的下标,越界了 for (i= 0 ;i< 3 ;i++)
    printf( " %.2lf " ,*target++);
  putchar( ' \n ' );
for (i = 0 ; i< 3 ; i++)
    printf( " %.2lf " , target);
  puts( "" );
} 因为 *target++=*source++;指针的位置是target[2]而后面的       printf("%.2lf",*target++);
  输出的是数组以外内存地址,所以越界

这个的确是我错了。
这个问题出现的原因在于你的打印函数在你复制的函数中,打印的时候 target指针已经变动过了,不再指向第一个元素而已。
如果把打印的部分代码移动到主函数中,那么结果就是一切正常的。

C++ 用无参数构造函数生成对象时候请勿在构造函数后添加无用的那一对括号,否则有可能会被当成函数声明而忽略,嗯,栈上构建的时候就是这样。
2011-09-08 18:27
编程的乐趣
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:229
专家分:1027
注 册:2011-4-4
收藏
得分:0 
呵呵
2011-09-08 18:45
听风的声音
Rank: 2
等 级:论坛游民
帖 子:7
专家分:11
注 册:2011-9-8
收藏
得分:2 
回复 楼主 hanxiaokun
#include<stdio.h>
float target[3];
int main()
{
    void copy_ptr(float *p,float *q);
    int i;
    float source[8]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8};
    copy_ptr(&source[2],target);
    return 0;
}
void copy_ptr(float *p,float *q)
{
    int i;
    for(i=0;i<=4;i++)
    {
        *q++=*p++;   
    }
    for(q=target;q-target<5;q++)
        printf("%3.1f ",*q);
    printf("\n");
}

这个运行过的。
2011-09-08 21:10
快速回复:关于指针,函数,数组的程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017214 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved