C 指针跟数组问题求组


编写一个程序,初始化一个double类型的数组,然后把该数组拷贝至3个其他数组中(在main()中声明这4个数组)。使用带数组表示法的函数进行第1份拷贝。使用带指针表示法和指针递增函数进行第2份拷贝。把目标数组名、源数组名和待拷贝的元素个数作为前两个函数的参数。第3个函数以目标数组名、源数组名和指向源数组最后一个元素后面的元素的指正。也就是说,给定以下声明,则函数调用如下表示: 
double source[5] = {1.1, 2.2, 3.3, 4.4, 5.5}; 
 double target1[5]; 
 double target2[5]; 
 double target3[5];

copy_arr(target1, source, 5); 
 copy_ptr(target2, source, 5); 
 copy_ptrs(target3, source, source + 5);


#include<stdio.h>
#define SIZE 5

void copy_arr(double ar[], double a[],int n);
void copy_ptr(double *a, double *b,int n);
void copy_ptrs(double *a, double *b,double *end);

int main()
{
double source[SIZE] = {1.1, 2.2, 3.3, 4.4, 5.5};
double target1[SIZE];
double target2[SIZE];
double target3[SIZE];

       copy_arr(target1, source, SIZE);

copy_ptr(target2, source, SIZE);
 
copy_ptrs(target3, source, source+SIZE);
return 0;
}


void copy_arr(double ar[], double a[],int n)
{
int i;
for(i=0;i<n;i++)
ar[i] = a[i];
for(i=0;i<n;i++)
{
printf("target1[%d] = %.2lf", i, ar[i]);
printf("\n");
}
}

void copy_ptr(double *a, double *b,int n)
{
int i;
for(i=0;i<n;i++)
*(a+i) = *(b+i);
for(i=0;i<n;i++)
{
printf("target2[%d] = %.2lf", i, a[i]);
printf("\n");
}
}


void copy_ptrs(double *a, double *b,double *end)
{
int i;
while(b<end)
{
*a = *b;
b++;
a++;
}

for(i=0;i<SIZE;i++)
{
printf("target3[%d] = %.2lf ", i, *(a+i));   // 该循环   打印出来的结果不对   不知道什么原因  求大神指导
[code=c]
[/code]
printf("\n");
}
}



5 个解决方案

#1


#include<stdio.h>
#define SIZE 5

void copy_arr(double ar[], double a[], int n);
void copy_ptr(double *a, double *b, int n);
void copy_ptrs(double *a, double *b, double *end);

int main()
{
double source[SIZE] = { 1.1, 2.2, 3.3, 4.4, 5.5 };
double target1[SIZE];
double target2[SIZE];
double target3[SIZE];

copy_arr(target1, source, SIZE);

copy_ptr(target2, source, SIZE);

copy_ptrs(target3, source, source + SIZE);
return 0;
}


void copy_arr(double ar[], double a[], int n)
{
int i;
for (i = 0; i<n; i++)
ar[i] = a[i];
for (i = 0; i<n; i++)
{
printf("target1[%d] = %.2lf", i, ar[i]);
printf("\n");
}
}

void copy_ptr(double *a, double *b, int n)
{
int i;
for (i = 0; i<n; i++)
*(a + i) = *(b + i);
for (i = 0; i<n; i++)
{
printf("target2[%d] = %.2lf", i, a[i]);
printf("\n");
}
}


void copy_ptrs(double *a, double *b, double *end)
{
int i;
double *c;
c = a;
while (b < end)
{
*a = *b;
b++;
a++;
}

for (i = 0; i < SIZE; i++)
{
printf("target3[%d] = %.2lf ", i, *(c+i));
printf("\n");
}
}

#2


第三个函数里面a指向的地址已经变过了,所以直接输出会从后面开始

#3


http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

#4


void copy_ptrs(double *a, double *b,double *end)
{
    int i;
    double *tmp = a;
    while(b<end)
    {
        *tmp = *b;
        b++;
        tmp++;
    }

    for(i=0;i<SIZE;i++)
    {
        printf("target3[%d] = %.2lf ", i, *(a+i));
        printf("\n");
    }
}

其他函数没问题,最后一个函数的问题是a已经指向数组的末尾,所以a+i已经是越界。
解决办法是赋值用一个tmp代替a,这样a还是指向目标数组的开始位置;

#5


十分感谢 确实越界了  @ cfjtaishan @ yx777777 
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告