這個問題在這里已經有了答案: 什么是陣列到指標衰減? (11 個回答) 3 小時前關閉。
我在這里定義了一個接受陣列作為引數的函式
void print(char ch[]);
當我呼叫函式并將陣列作為引數提供時
int main(){
char ch[10];
print(ch);
}
我在兩個不同的函式中列印這兩個變數的地址,
#include <stdio.h>
void print(char ch[]) {
printf("address of ch is %d\n",ch);
}
int main() {
char ch[10];
print(ch);
printf("address of ch is %d\n",ch);
return 0;
}
主函式中的陣列地址必須和我定義的函式中作為引數的陣列地址不同,但是是一樣的。為什么?
運行此代碼的結果
變數的地址是否可以為負?
感謝您花時間閱讀這個問題。
uj5u.com熱心網友回復:
char ch[10];
這個變數是一個陣列。它隱式轉換為指向第一個元素的指標。指標的值是它指向的物件的地址,該地址是您看到的輸出1。
void print(char ch[]) {
這個引數是一個指標。它可能看起來像一個陣列,但陣列引數被調整為指向陣列元素的指標。當你輸出一個指標的值時,你看到的是指向物件的地址;不是存盤指標的變數的地址。
由于您作為引數傳遞的指標指向本地陣列的第一個元素,因此您看到的地址1是相同的。
變數有不同的地址,但引數變數的值與陣列變數的第一個元素的地址相同。
1除了,您使用了與引數型別不匹配的錯誤格式說明符,因此程式的行為實際上是未定義的。不要這樣做。如果您絕對必須使用printf,那么您必須使用%p格式說明符并將引數轉換為void*.
uj5u.com熱心網友回復:
對于初學者輸出指標,您需要使用轉換說明符%p而不是轉換說明符%d。否則呼叫printf呼叫未定義的行為。
printf("address of ch is %p\n", ( void * )ch);
其次,在函式內 this 呼叫printf不輸出變數ch本身的地址。它輸出指標運算式所指向的陣列的第一個元素的地址ch。由于陣列未在記憶體中移動,因此您將獲得相同的地址值。
要輸出函式引數的地址,您需要撰寫
void print(char ch[]) {
printf("address of ch is %p\n", ( void * )&ch);
}
在此通話中注意這一點
print(ch);
該陣列被隱式轉換為指向其第一個元素的指標。并且編譯器將具有陣列型別的函式引數調整為指向陣列元素型別的指標
void print(char *ch) {
在printf宣告源陣列的地方和函式內的這兩個呼叫in main之間存在差異
printf("address of ch is %p\n", ( void * )ch);
printf("address of ch is %p\n", ( void * )&ch);
在函式中,第一次呼叫輸出由指標指向的陣列的第一個元素的地址,該指標ch是陣列占用的記憶體范圍的地址。
第二個呼叫輸出ch 具有型別的區域變數本身的地址char *(如上所述)。
這些呼叫主要輸出與陣列占用的記憶體范圍地址相同的值。第一次呼叫輸出陣列第一個元素的地址,第二次呼叫將陣列的地址作為整個物件輸出。這兩個值都是陣列占用的記憶體范圍的初始地址。
uj5u.com熱心網友回復:
你是對的,兩個不同的陣列不能有相同的地址。
char ch[]雖然不是一個陣列。嘗試將陣列用作函式引數時,會默默地創建一個指標,因此在這種情況下,它意味著char *ch. (但char ch[10];inmain仍然是一個陣列,因為它不是引數。)
ch(其中ch是char ch[] 引數)不是 的地址。 ch這是一個ch指向的地址。&ch將是ch其自身的地址,并且將具有不同的值。
但是對于char ch[10]in main,由于它是一個陣列,ch并且&ch具有相同的值(但型別不同:char *vs char (*)[10](指向 10 個字符的陣列的指標))。
uj5u.com熱心網友回復:
與原始型別相反,陣列總是通過地址(作為指標)傳遞給函式,即使你沒有明確地這樣做。因此,函式范圍內的陣列地址將與范圍外的地址相同。
uj5u.com熱心網友回復:
為什么這兩個區域變數的地址是一樣的?
將C 風格的陣列傳遞給函式實際上是將其指標傳遞給該函式,而不是整個陣列。這void print(char ch[]);與void print(char* ch);所以兩個函式都在main函式 ( char ch[10];)中列印同一陣列的地址相同。
如果要將陣列的副本傳遞給函式,可以使用std::array如下:
#include <cstdio>
#include <array>
template<std::size_t N>
void print(std::array<char, N> ch) {
printf("address of ch is %d\n", ch.data());
}
int main() {
std::array<char, 10> ch;
print(ch);
printf("address of ch is %d\n", ch.data());
return 0;
}
現在地址將不一樣了。
變數的地址是否可以為負?
這里:
printf("address of ch is %d\n",ch);
上面的陳述句將ch(指標)解釋為十進制值(因為'%d')。這就是為什么你看到一個負數。您需要%p改用:
void print(char ch[]) {
printf("address of ch is %p\n", (void*) &ch);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/419657.html
標籤:
上一篇:條件即使不是也回傳True
