我一直在学习数组,但有一点我无法弄清楚。 我为C借了两本书并在线查看,但没有找到解决办法。
我的函数timesTen将我拥有的每个数组elemenet乘以10, 然后返回该数组的指针返回函数main()
如何直接在数组x [2]中复制数组a [2]?
我通常会使用for循环,但我不能,因为参数有两个不同的函数。
解决方案可能与指针有关,所以请随意在这里发布sollution,但是还有什么方法可以解决它们吗?
继承源代码:
#include <stdio.h>
int timesTen(int a[])
{
int i;
for (i=0;i<2;i++)
{
printf("%d\t", a[i]);
a[i]*=10;
printf("%d\n", a[i]);
}
return a;
}
int main()
{
int i;
int x[2];
int a[2]={10,50};
// i know here's an error, but how do I fix it? I cant put x[0]=timesTen(a[0])
x[2] = timesTen(a);
//also what if there is array a[10], and I want to copy it in x[5]
for (i=0;i<2;i++)
printf("%d\n", x[i]);
return 0;
}
谢谢!
答案 0 :(得分:1)
在函数timesTen
中,由于a
是一个数组,因此在函数中对它进行的每个修改也都是对你传递的参数进行的(按地址调用而不是按值调用)。因此,您不需要返回任何内容。
void timesTen(int a[])
{
int i;
for (i=0;i<2;i++) a[i]*=10;
}
你只需通过以下方式来打电话:
timesTen(a);
答案 1 :(得分:1)
您需要了解的是数组和指针之间的区别。在main()
中声明两个数组时,为两个整数分配两次内存。没关系。但是在C语言中,你根本无法传递数组(如:隐式分配一堆新的内存并将源数组的数据复制到这个内存区域)。相反,几乎在所有情况下,任何数组标识符都将衰减到指向数组的第一个元素的指针。所以当你写
int x[2];
int a[2]={10,50};
timesTen(a);
此代码恰好等同于
int x[2];
int a[2]={10,50};
timesTen(&a[0]);
那么,为什么这与timesTen()
的声明没有冲突?因为函数声明中的数组参数在那里当场衰减成指针!所以,你的函数声明正好等同于这个:
int timesTen(int* a) {
这是C语言中最不被理解的特性之一,并且不可否认,很难将你的大脑包裹起来,但是一旦你理解了指针衰减意味着什么,你就可以更轻松地使用指针和数组了。
所以,回到你的问题。由于您只将指向数组的指针传递给timesTen()
,并且由于您修改了此数组,因此更改可在main()
中直接显示。有两种方法可以实现您想要的行为:
您可以更改timesTen()
的定义,将数据复制到目标数组中:
void timesTen(int size, int* source, int* dest) {
for(int i = 0; i < size; i++) dest[i] = 10*source[i];
}
int main() {
int x[2];
int a[2]={10,50};
timesTen(2, a, x); //pointer decay!
//x now contains {100, 500}
}
您可以在调用函数之前将数据复制到目标数组中以修改目标数组:
void timesTen(int size, int* data) {
for(int i = 0; i < size; i++) data[i] = 10*data[i];
}
int main() {
int x[2];
int a[2]={10,50};
memcpy(x, a, sizeof(a)); //the sizeof operator is one of only two places where no pointer decay happens!
timesTen(2, x); //pointer decay!
//x now contains {100, 500}
}
答案 2 :(得分:0)
你可能想要这样的东西:
timesTen(a);
memmove(x, a, 2 * sizeof(x[0]));
而不是
x[2] = timesTen(a);
请注意,您的函数不需要返回任何内容,因为它正在修改其原始位置的数组。在C中如果你有一个数组参数,则意味着只传递一个指针,而不是整个数组。
答案 3 :(得分:0)
:
int *p;
int i;
p = timesTen(a);
for ( i = 0; i < 2; i++ )
{
printf( "%d\n",*(p + i)); // here you can print the values returned from your function
}
答案 4 :(得分:0)
通过指针,您可以轻松管理它
main ()
{
int a[ 2 ];
int *ptr = timesTen(a);
for ( int i=0; i<2 ; i++)
{
printf("%d",ptr[i]);
}
至于
x[2] = timesTen(a);
请注意x [2]会给出“来自x的基地的adrees的第二个地址的值” 它不是一个变量,但它是一个值,你不能分配给一个值。 从技术上讲,x [2]不是左值。