第十章指针和数组,课后编程题@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的指向地址,从而发生了错误。
``