void f(int a[]);
int main() {
int a[11];
printf("1.%x ", &a);
f(a);
}
void f(int a[]) {
printf("2.%x ", &a);
}
輸出:
1.e0de4940 2.e0de4928
但是洗掉 & 時輸出將相同。為什么無論陣列的大小如何,差異都是 12?
uj5u.com熱心網友回復:
主要是呼叫 printf
int a[11];
printf("1.%x ",&a);
需要使用轉換說明符的地方%p輸出陣列的地址a。
內的功能f此呼叫的printf輸出區域變數(引數)的地址a的函式的
printf("2.%x ", &a);
由于陣列和a型別的引數int *占用的記憶體范圍不同,因此它們的地址是不同的。
注意該引數a獲取的是 中a宣告的陣列第一個元素的地址main。所以存盤在引數的地址a是相同的陣列的地址a中main。那是你可以寫的
void f(int a[]);
int main() {
int a[11];
printf("1.%p ", ( void * )&a);
f(a);
}
void f(int a[]) {
printf("2.%p ", ( void * )a);
}
結果你會得到相同的輸出。
您可以簡化代碼以使其更容易理解幕后的內容。
考慮以下代碼片段
int a[11];
int *p = a;
如您所見,兩個變數 a 和 p 占用不同的記憶體區。所以這些 printf 的呼叫會產生不同的結果
printf( "%p\n", &a );
printf( "%p\n", &p );
uj5u.com熱心網友回復:
In main,a是一個陣列,并且&a是存盤該陣列的地址。當main呼叫f時,a在f(a)被自動轉換到的第一個元素的地址a,而地址被傳遞到f。
In f,a是一個引數,&a是存盤該引數的地址。引數的值a被設定為函式呼叫中傳遞的值,但是&a是引數的地址,它是值的副本。這是不是原來a在main。
uj5u.com熱心網友回復:
int a[]在語法上相同,因為int* a它們都是指向整數的指標(也稱為 int 陣列)。因此正確的方法是沒有&
void f(int a[]){
printf("2.%x ", a);
}
int main() {
int a[11];
printf("1.%x ",a);
f(a);
}
但是洗掉 & 時輸出將相同。為什么無論陣列的大小如何,差異都是 12?
最初,您&首先列印int a[11]. 然后將該陣列的地址傳遞給f()它生成一個也指向同一地址的不同指標的地方。但是,這是兩個不同的指標,因此當您列印實際指標的地址時,無論它們指向何處,它們都明顯不同。
的差異12(實際上是24因為數字是十六進制的)是任意的,它只是告訴您這兩個指標存盤在彼此24相距位元組的地址中
uj5u.com熱心網友回復:
在您的程式中,功能上只有一個小錯誤 f(int a[])
void f(int a[]) {
printf("2.%x ", &a);
}
函式f將引數的地址回傳給函式,而不是它指向的地址。
由于掌握 C 中的指標是理解的基本方面之一,不僅是 C 語言本身,還有機器架構和 CPU/記憶體功能的基礎知識。
因此,在指標運算和搜索/除錯中犯錯甚至可以讓有經驗的 C 程式員發瘋,難怪在 C 中使用 static_cast、dynamic_cast關鍵字并在隨后的計算機語言中完全洗掉(隱藏,即......)他們之后。
所以,我更進一步,重新撰寫了你的??代碼,更好地解釋了這個錯誤。
#include <stdio.h>
void f(int b[]) {
printf("\n func call. print address: %x", &b); }
void f2(int b[]) {
printf("\n func call. print address(2): %x", b); }
int main()
{
int *j, a[11];
j = a; // load address of 'a' array to int pointer 'j'
// pointer 'j'
// j = address of an array 'a'
// &j = address of 'j' !!
*j = 1; // value of any 'int' that 'j'
// points to is 1,so the value
// of a[0]= 1
// ______ print values of 'j', 'a' ______
// value is from address 'a'
printf("\n1.) value of number (j)= %d", *j);
// int value of address 'a'
printf("\n1.) value of number (a)= %d", a[0]);
// ______ print addresses of 'j', 'a' ______
// address of int variable 'j' that
// holds pointer to 'a'
printf("\n\n2.) addr of number (j)= %x", &j);
// address of 'a' array
printf("\n2.) addr of number (a)= %x", &a);
// ______ all of following adressess are the same ______
// actual pointer (points to 'a' now)
printf("\n\n3.) addr of 'j' = %x", j);
// address od an array 'a'
printf("\n3.) addr of 'a' = %x", a);
// address of first int member in array a
printf("\n3.) addr of 'a[0]'= %x\n", &a[0]);
// ______ print them from function ______ (yours) ..
f(&j); f(a); // outputs an address of an argument passed to a function !!!
// ______ print them from function ______ (changed) ..
f2(&j); f2(a); // outputs an address that an argument points to !!
// (holds address of)
return 0;
}
這int b[]在功能f和f2寫入故意的,而不是int a[]讓很清楚,論據是被推堆疊變數的副本-不是實際的變數 a。
程式輸出:
1.) value of number (j)= 1
1.) value of number (a)= 1
2.) addr of number (j)= 5f826328
2.) addr of number (a)= 5f826330
3.) addr of 'j' = 5f826330
3.) addr of 'a' = 5f826330
3.) addr of 'a[0]'= 5f826330
func call. print address: 5f826308
func call. print address: 5f826308
func call. print address(2): 5f826328
func call. print address(2): 5f826330
uj5u.com熱心網友回復:
其原因是,main()和f()把區域引數a在不同的地方的記憶,在某些時候,都main()和f()在其執行程序中和,因為這兩個引數是區域的,只在定義它們各自的功能,他們確實是不同的變數(盡管他們的名字是一樣的)
uj5u.com熱心網友回復:
當你寫的時候int a[],你參考了一個指標,因為陣列是指標。要參考 wherea指向,您只需撰寫a. 當你寫的時候&a,你指的是指標本身的記憶體地址。指標本身的記憶體地址是不同的,因為您按值傳遞指標(記憶體地址本身),這意味著它們在每個函式中都有一個副本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/385072.html
下一篇:c 唯一指標的動態轉換回傳什么?
