簡體   English   中英

將數組作為參數傳遞時會發生什么情況?

[英]What happens to arrays when they are passed as arguments?

最近,我痛苦地了解到,如果將數組傳遞給函數,則它會“衰減”到指針。

那么我的問題是,在創建數組的范圍內將其視為什么?sizeof如何區分兩者之間的區別? 我以為所有數組都是指針,並且方括號將指針向前移動並一次性取消引用。 觀察以下代碼:

[name@localhost lab03]$ cat arraysAsArguments.c
#include <stdio.h>

void function(int array[]) //Treated as pointer
{
  printf("%x", array);
  int size = sizeof array;
  int firstElement = sizeof array[0];
  printf("size: %d\n", size);
  printf("firstElement: %d\n", firstElement);
}

int main()
{
  int array[] = {0,1,2,3,4,5}; // expected size = 6*4 = 24 bytes
  printf("%x", array);
  int size = sizeof array;
  int firstElement = sizeof array[0];
  printf("size: %d\n", size);
  printf("firstElement: %d\n", firstElement);
  function(array);
}

[name@localhost lab03]$ clang arraysAsArguments.c
arraysAsArguments.c:5:12: warning: conversion specifies type 'unsigned int' but the argument has type 'int *' [-Wformat]
  printf("%x", array);
          ~^   ~~~~~
arraysAsArguments.c:15:12: warning: conversion specifies type 'unsigned int' but the argument has type 'int *' [-Wformat]
  printf("%x", array);
          ~^   ~~~~~
2 warnings generated.
[name@localhost lab03]$ ./a.out
57c84940size: 24
firstElement: 4
57c84940size: 8
firstElement: 4

在main和function中,array均為int *類型。 到底是怎么回事?!

作為函數傳遞時,數組會衰減到指向其第一個元素的指針。 這就是為什么function內的sizeof調用不符合預期的原因,因為它正在指針上調用sizeof 內部function這條線

int size = sizeof array;

array已經衰減到指針,並且您將int*的大小存儲在您的size變量中。

您仍然可以通過參數訪問數組中的元素,盡管作為表示法

array[1];

是相同的

*(array + 1);

如果您聲明函數直接接受int*作為參數而不是數組,則訪問數組元素的方式與訪問數組元素相同。 所有這一切已經發生衰變是一個指針-你的int array[]中的main仍是一個數組。

抄送常見問題解答:6.4

由於數組會立即衰減為指針,因此數組實際上不會傳遞給函數。 您可以假裝一個函數接收一個數組作為參數,並通過將相應的參數聲明為數組來說明它:

 void f(char a[]) { ... } 

從字面上解釋,此聲明將毫無用處,因此編譯器轉過身來並假裝您編寫了指針聲明,因為該函數實際上將接收以下內容:

 void f(char *a) { ... } 

c-faq:當數組是函數的參數時,為什么sizeof不能正確報告數組的大小?

編譯器假裝將數組參數聲明為指針(在本示例中為char *a; ),並且sizeof報告指針的大小。

我建議您閱讀c-faq的整個部分:6.數組和指針

按照您的聲明,同時將數組傳遞給函數Arrays衰減到指針是正確的。

我們可以說數組只不過是指針,唯一的區別是“數組是常量指針的”

int arr[3] = {1,2,3};

因此,這里我們可以通過將指針取消引用用作%d,*(arr + 0);來獲取數組元素。

printf("%d %d \n",*(arr+0),arr[0]);

另外,char str =“ string”; printf(“%c \\ n”, (str + 0));

因此,根據我的理解,數組和指針是相同的,唯一的區別是數組是常數POINTERS 即我們不能做arr ++; 排列。

int arr[3];
char *str;

如果我們將數組傳遞給函數,那么我們對arr所做的任何更改都會反映在調用函數數組中,因為arr,&arr和&arr [0]相同。 指針中的哪里:str和&str不同。

暫無
暫無

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

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