這里有一個初學者問題,但我們究竟為什么要這樣做?就像它是如何作業的/它背后的邏輯是什么?
我的意思的例子(我也想知道為什么我們只用 Create 函式這樣做)
#include<stdio.h>
void create(int *T,int n){ int i; printf("tab: ");
for(i=0;i<n;i ) scanf("%d",&T[i]);
}
void print(int T[],int n){ int i;
for(i=0;i<n;i ) printf("[%d]",T[i]);
}
int main(){ int n;
printf("size: "); scanf("%d",&n);
int T[100];
create(T,n);
print(T,n);
}
uj5u.com熱心網友回復:
除非它是、 或一元運算子的運算元sizeof,或者是用于在宣告中初始化字符陣列的字串文字,否則“N 元素陣列”型別的運算式將被轉換或“衰減”為型別為“pointer to ”的運算式,其值將是陣列第一個元素的地址。_Alignof&TT
因此,當您以陣列運算式作為引數呼叫函式時:
T arr[N];
...
foo( arr );
函式實際接收的是指向陣列第一個元素的指標 - 它相當于呼叫函式
foo( &arr[0] );
這種行為是有原因的。Ritchie 從稱為 B 的早期語言派生出 C,當您在 B 中創建陣列時,編譯器會預留一個額外的單詞來存盤第一個元素的偏移量。下標操作a[i]被定義為*(a i)- 給定存盤在 中的起始地址,從該地址a偏移i字并取消參考結果。
a[i] == *(a i)Ritchie想要保留該下標行為(第一個元素,除了上面列出的情況。
不再需要存盤單獨的指標,但現在陣列在大多數情況下都失去了“陣列特性”,包括當它們作為函式引數傳遞時。
在函式引數宣告的背景關系中,T a[N]并且T a[]被“調整”為T *a. 大多數時候我們只是將它宣告為一個指標,因為那是我們實際收到的。
uj5u.com熱心網友回復:
int T[]與函式引數中的相同int* T。陣列在傳遞給函式時總是 衰減為 C 中的指標。所以int T[]和int* T是同一事物的不同語法,您可以使用或。
uj5u.com熱心網友回復:
指標只是一個記憶體地址。當我們說它int* a時,它的意思是“我們期望int存盤型別元素的記憶體地址”。陣列在內部被視為指標。讓我們看一下下面的代碼,以便您更好地理解這一點。
int b[4] = {1,2,3,4};
*b == 1,因為 b 是存盤陣列第一個元素的記憶體地址。
當我們訪問時會發生什么b[1]?好吧,編譯器知道陣列的每個元素都是 type int,它知道 type 的大小int。所以它只是將它添加到b指標的原始記憶體地址并回傳該地址的內容。
當然,您可以在不使用陣列的情況下復制此行為。例如:
*(b) = b[0]
*(b 1) = b[1]
*(b 2) = b[2]
等等。
希望這可以幫助。我建議您在真正理解它之前開始修改它:指標運算對于理解 C 編程非常重要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/530138.html
標籤:数组C指针
下一篇:常規陣列和指標陣列有什么區別
