【发布时间】:2011-08-03 13:57:26
【问题描述】:
我试图通过将四个数组中的所有值发送到一个单独的函数来打印它们。但是,问题是我无法获得打印数组中所有整数的函数,因为我不确定我可以将for 循环中的条件语句设置为什么,这对于任何数组都是通用的任何大小。
目前该函数只打印前 11 个数字。我认为这是因为该数组中的第一个数字是 11。
#include【问题讨论】:
我试图通过将四个数组中的所有值发送到一个单独的函数来打印它们。但是,问题是我无法获得打印数组中所有整数的函数,因为我不确定我可以将for 循环中的条件语句设置为什么,这对于任何数组都是通用的任何大小。
目前该函数只打印前 11 个数字。我认为这是因为该数组中的第一个数字是 11。
#include【问题讨论】:
将第二个参数传递给您的函数,该参数采用数组的长度。例如:
print_array(int *array, int length)
{
for (int i = 0; i < length; i++) { /* whatever */ }
}
【讨论】:
函数无法知道数组何时结束。除非您手动传递,否则这条数据根本不存在。数组只是内存中的一个字节序列,它没有结束分隔符。所以你应该给函数添加一个参数,告诉它数组的长度。
是的,这就是它在 C 中的工作方式。
【讨论】:
将函数改为:
void print_array(int a[], size_t a_size) {
int i;
for(i=0; i< a_size;i++)
// ...
并改变函数的调用传入大小:
print_array(second, sizeof(second)/sizeof(second[0]));
它将计算数组的内存大小(对于 32 位系统上的 4 int 数组,它将是 16)并将其除以 int 的大小(在 32 位系统上,它是 4 个字节)。
【讨论】:
在 C 中,您可以使用函数和宏来实现:
void printArray_(int *a, int len) {
for (int i = 0; i < len; i++) printf("%d ", a[i]);
}
#define printArray(arr) printArray_((arr), sizeof(arr)/sizeof(arr[0]))
int main(int argc, _TCHAR* argv[])
{
int data[] = { 1,2,3,4 };
printArray(data);
return 0;
}
输出:
1 2 3 4
【讨论】:
sizeof(arr)调用将返回sizeof(char *),而不是"array decay"。跨度>
改变这一行
print_array(&second[0]);
到
print_array(&second);
因为, &second[0] 只是传递对第 0 位元素的引用,无法遍历数组。
并且我们不能遍历没有大小的引用传递的数组。由于数组的大小不同,我们可以通过以下方式计算数组的大小,
int array_length = sizeof(array)/sizeof(array[0]);
换行
void print_array(int a[])
到
void print_array(int *a,int array_length)
而数组打印的功能就是,
void print_array(int *a,int array_length){
int i;
for(i=0;i<array_length;i++){
printf("%d ",*a);
a++; //for incrementing the position of array.
}
}
【讨论】: