[英]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
仍是一個數組。
由於數組會立即衰減為指針,因此數組實際上不會傳遞給函數。 您可以假裝一個函數接收一個數組作為參數,並通過將相應的參數聲明為數組來說明它:
void f(char a[]) { ... }
從字面上解釋,此聲明將毫無用處,因此編譯器轉過身來並假裝您編寫了指針聲明,因為該函數實際上將接收以下內容:
void f(char *a) { ... }
c-faq:當數組是函數的參數時,為什么sizeof不能正確報告數組的大小? :
編譯器假裝將數組參數聲明為指針(在本示例中為
char *a;
),並且sizeof
報告指針的大小。
按照您的聲明,同時將數組傳遞給函數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.