为了我的项目,我正在从Python切换到C代码。当我尝试操作数组时,它与我以前在python中所做的非常不同。因此,我只想了解C和Python中数组的一些“等效”操作。

因此,对于Python中的numpy数组,我们可以轻松地逐元素直接求和(或其他操作)两个数组。从某种意义上说,我认为numpy数组就像一个虚拟的“矩阵”,您可以对其进行操作,就好像它作为一个整体存储(至少看起来是这样)。

对于C数组,它看起来像另一只动物。从我可以从互联网上搜索到的内容来看,我必须使用for循环才能执行这些基本操作。我认为C中的数组只是一组值,它们按顺序彼此相邻地存储在地址中。

我知道C比Python快得多,但是我也知道for循环是一件令人讨厌的事情,在Python中应避免使用。 C中的这些for循环会不会减慢程序的速度?(尽管我认为当我在Python中使用numpy模块时,该模块会隐式地处理这些for循环)

我也对指针感到困惑。考虑以下包含一维数组的函数:

int myfunc(int *myarray);
{
 int sum=0;
 for(int i=0; i<sizeof(myarray); i++)
   {
     sum += myarray[i];
   }
 return sum
 }


假设我输入了一些说“ arr”的数组,然后让:

*myarray = arr


因此,稍后在函数中,当我调用诸如以下代码的行时:

sum += myarray[i]


我实际上是在这样做:

sum += &arr


真是令人困惑。对我来说,我好像直接将变量的地址与其他变量的值相加。这段代码是错误的还是我误解了指针?

最佳答案

在您的职能:

int myfunc(int *myarray);             //  The ; at the end of this line will
                                      //  generate a compiler error.
{
 int sum=0;
 for(int i=0; i<sizeof(myarray); i++) // size of int* is the size of a pointer
                                      // 4 for 32bit app, or 8 for 64 bits apps
 {
     sum += myarray[i];
 }
 return sum
}


您应该将元素数量作为参数传递给数组,以使其起作用:

int myfunc(int *myarray, int count)
{
 int sum=0;
 for (int i = 0; i < count; i++)
 {
     sum += myarray[i];
 }
 return sum;
}


[编辑]执行此操作时:

sum += &arr;


您正在使用变量sum的地址递增arr

鉴于:

sum += array[i];


使用存储在sumint位置的(i+1)th值使array递增。

以下语句:

*myarray = arr;


将arr的值存储到myarray指向的值中,这等效于编写:

myarray[0] = arr;

关于python - 与Python相比,C数组的基本操作和操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44608790/

10-11 22:13
查看更多