簡體   English   中英

即使數組衰減到POINTERS,如何將函數的參數保持為ARRAY呢?

[英]How come even though arrays decay to POINTERS, its fine to keep the parameter of the function as an ARRAY?

請原諒我英語不好

讓我澄清一下,這是一個例子,

這是我們的主要:

 main()
{
  int a1 []= {1,2,3,4,5,6,7,8,9} ;
  int size = sizeof(a1) /sizeof(a1[0]) ;
  point (a1 , size);

  return 0 ;
}

這是函數:

void point(int a[] , int size)
{
  int i ;
  for (i = 0 ; i<size ; i++)
  printf("%d\n", a[i])) ;
}

據我所知,當數組作為參數傳遞給函數時,實際上是在向數組的第一個元素發送指針。

話雖這么說,函數“ point”的參數為什么是ARRAY變量,而不是POINTER變量...?

我認為這很奇怪的原因,因此例如在main中,我們將int *傳遞給某些函數:

  int* a = &b ;
  point2(a) ;

功能:

void point2 (int  a) // this would be invalid, it has to be int* a
{
  .
  .
}

我們必須指定該函數接收一個指針,數組如何成為異常?

請注意:我的確理解數組會衰減到指針。 這就是為什么我的問題永遠不會是“為什么我們為什么要將數組作為參數發送給具有相同類型指針的函數?”。 我的問題是,“即使數組衰減到POINTERS,如何將函數的參數保留為ARRAY也可以?”。 希望很清楚,第一個問題與之前的問題有何不同。 謝謝!

C和C ++的語言規范都聲明將T類型數組的功能參數調整為指向T指針。 因此,這些函數聲明是相同的:

void foo(int a[42]);
void foo(int a[]);
void foo(int* a);

所有這些都將接受一個指針參數,無論它是否是數組衰減的結果。

句法糖

就像juanchopanza注意到的那樣,在函數參數中等效於具有數組或指針。

為了娛樂,請嘗試以下操作:

void foo(int a[42])
{
  printf("%zu\n", sizeof(a));
}

int main(int argc, char **argv)
{
  int a[42];
  printf("%zu\n", sizeof(a));
  foo(a);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM