如何計算數組中元素的個數數組中元素的個數,如果我不希望傳遞一個元素作爲另一種說法說的數量,計算傳遞給函數
fun(a, sizeof(a)/sizeof(*a));
和接收作爲
int fun(int a[], int limit)
{
}
如何計算數組中元素的個數數組中元素的個數,如果我不希望傳遞一個元素作爲另一種說法說的數量,計算傳遞給函數
fun(a, sizeof(a)/sizeof(*a));
和接收作爲
int fun(int a[], int limit)
{
}
如何可以計算在陣列中元件的數量
你不能。
如果我不希望傳遞的元素數量爲另一種說法
你必須這樣做。
這是C,那裏沒有寶寶保姆或魔杖。如果你需要跟蹤一段信息(比如數組的長度),你必須自己去做。這種明確性是我們使用C的原因,所以我們知道恰恰是發生了什麼,沒有編譯器在背後做着瘋狂的事情。
你會看到宏是這樣的:
#define ARRAY_LENGTH(x) (sizeof(x)/sizeof(x[0]))
但要小心!這僅適用於陣列,其中大小在編譯時已知。它將而不是工作的任意指針。
Linux內核提供了這個宏以安全的方式:
#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[0]) + __must_be_array(arr))
/* &a[0] degrades to a pointer: a different type from an array */
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
如果這樣做:
main()
{
int a[]={1,2,3};
fun(a);
}
fun(int a[])
{
}
您沒有將數組作爲副本傳遞。它只是一個指向第一個元素在內存中的地址的指針。
但它會工作:
#include <stdio.h>
int fun(int*, int);
int main(void)
{
int a[] = {1,2,3,4,5,6,7};
int si=sizeof(a)/sizeof(a[0]);
int b=fun(a, si);
return 0;
}
int fun(int ar[], int si)
{
int i = 0;
printf("size of a==%d\n",si);
for(i=0; i<si; i++)
printf("%d ",ar[i]);
}
聲明
int fun(int someArray[])
相當於
int fun(int *someArray)
這是說,只有信息fun
接收有關陣列一個指向第一個元素的指針。因此,確定數組大小的唯一方法(除了將大小作爲單獨的參數傳遞外)是將標記放在數組的末尾。標記是一個否則不會在數組中出現的值。
例如,以下代碼使用值-1
作爲數組末尾的標記。
#include <stdio.h>
void fun(int a[])
{
int i;
for (i=0; a[i] >= 0; i++)
printf("%d ", a[i]);
printf("\nArray has %d elements\n", i);
}
int main(void)
{
int a[] = {1,2,3,4,5,6,7,-1};
fun(a);
return 0;
}
這實際上是字符串℃。NUL終止子是如何工作的'\0'
充當在字符陣列的端部的定點,使得串長度不具有作爲獨立參數的所有要傳遞的字符串函數。
這可能不用說,這假設你的數組將會從不包含'-1'的* actual *值。 –
你不能這樣做,數組衰減到指針時,傳遞給函數 – P0W
請使用搜索功能,有幾十個問題,有答案,問完全相同的東西 –