我是初学者。我非常熟悉Java,在迭代数组中我很简单:
for (i = 0; i < arr.length; i++)
// Stuff here
但是在C中,*符号会让我失望。有人可以解释为什么下面的输入变量引用一个数组,以及迭代它的语法吗?
double function(const double* values);
答案 0 :(得分:5)
它没有引用数组,它指的是单个const double
元素。但是,该元素很可能是常数双精度数组中的第一个。
因此,如果我们预先形成指针算术,我们可能会引用数组中的其他元素。为此,您可以使用下标运算符values[i]
。但您必须确保只计算和引用阵列中的地址。而且你无法从指针值中知道这一点。
因此,除非您的函数被修改为接收大小参数,否则您通常不会引用除地址传递之外的任何元素。
然而,一旦你有了可用的大小,迭代应该看起来就像你从Java体验中得到的那样:
double function(const size_t num_elem, const double* values) {
double result = 0.0;
// .. pre iteration stuff
for (size_t i = 0; i < num_elem; ++i) {
if (values[i] < 1e-6)
// do something
}
// post iteration stuff
return result;
}
答案 1 :(得分:0)
C中的数组是分配用于保存某种类型的多个元素的一块内存。访问每个元素的方法是使用指向内存位置的指针并取消引用它(即*ptr
)。
values
是指向可以存储double
的内存位置的指针。假设它指向分配给存储double
的一块内存的第一个位置,您可以通过执行*values
或values[0]
来访问该块中的第一个元素。将使用*(values + 1)
或values[1]
访问第二个元素。等等。
鉴于此,你只能通过将位置放在一起来了解内存块的大小。该函数需要采用另一个参数来告诉它应该有多少元素。
double function(const double* values, const int count);
如果您刚开始使用C,我建议您深入了解该语言的基础知识。在掌握C的基本原理时,我发现The C Programming Language 非常简单,简短且内容丰富。
答案 2 :(得分:0)
Pure C数组不知道它们的大小(这就是C非常强大的原因)。您可以随时索引任何内容(只要操作系统允许您)
所以,
int main ( )
{
//size of your array, you could use size_t which is type for sizes I'll not be doing so,
//to simplify the code
const int size = 10
//both "size", the type and the name of the array are virtually infinitely flexible
int array[size] = {0}//never forget to initialize your array, or you'll get garbage.
//in pure C, you have to declare i before using it, here I declare and also initialize it
//because, why not?
int i = 0;
//since i have already been initialized, I could easily rewrite the for statement below:
//for ( ; i < size; ++i ) no initialization required.
for ( i = 0; i < size; ++ i )
{
array[i] //do whatever you want.
}
}