#include <iostream>
using namespace std;
void f(int *a,int n,int *max,int *min)
{
max=min=a;//這里如果改成*max=*min=a[0];就是正確的
for(int i=1;i<n;i++)
{
if(*max<a[i]) *max=a[i];
if(*min>a[i]) *min=a[i];
}
}
int main()
{
int a[10]={2,5,3,9,0,8,1,7,6,4};
int max,min;
f(a,10,&max,&min);
cout<<"Max: "<<max<<endl;
cout<<"Min: "<<min<<endl;
return 0;
}
uj5u.com熱心網友回復:
max,min是指標,在f里面,你修改他的指向,出了函式,就恢復原狀,沒用的uj5u.com熱心網友回復:
但是指標本就可以跨函式進行訪問和資料輸出啊,max=min=a難道不是表示max和min同時指向陣列a的首地址么?
uj5u.com熱心網友回復:
你需要了解c/c++函式呼叫中引數傳遞的基本知識。
你把一個引數傳遞給函式,其實是它的副本,例如你的代碼 把&max,&min傳遞給了fn。那么在fn里面就有一個max地址的副本,如果對這個地址指向的記憶體單元寫入則能夠把結果傳回來,而你修改了地址。因為他是副本,函式結束后自然就沒了。
uj5u.com熱心網友回復:
改成這樣:#include <iostream>
using namespace std;
void f(int *a,int n,int &max,int &min)
{
max=min=*a;
for(int i=1;i<n;i++)
{
if(max<a[i]) max=a[i];
if(min>a[i]) min=a[i];
}
}
int main()
{
int a[10]={2,5,3,9,0,8,1,7,6,4};
int max,min;
f(a,10,max,min);
cout<<"Max: "<<max<<endl;
cout<<"Min: "<<min<<endl;
return 0;
}
uj5u.com熱心網友回復:
改成這樣:#include <iostream>
using namespace std;
void f(int *a,int n,int &max,int &min)
{
max=min=*a;
for(int i=1;i<n;i++)
{
if(max<a[i]) max=a[i];
if(min>a[i]) min=a[i];
}
}
int main()
{
int a[10]={2,5,3,9,0,8,1,7,6,4};
int max,min;
f(a,10,max,min);
cout<<"Max: "<<max<<endl;
cout<<"Min: "<<min<<endl;
return 0;
}
uj5u.com熱心網友回復:
新手基本都搞不明白函式引數里的指標問題這個其實要從編譯原理和程式運行的原理來講
就是說當一段代碼遇到函式呼叫的時候,可以理解成從一個空間跳轉到另一個空間去執行代碼,這就需要傳遞引數,而在函式內部代碼使用的引數,是一個區域變數,在引數傳遞的程序中被賦值,所以你在函式內操作引數,并不會直接影響函式外部代碼的資料。而指標,在使用 * 號解參考之前,只是一個表示地址的 int 資料,所以在引數傳遞程序中,只是把地址值賦值給函式內部的“引數變數”,你在函式內部通過賦值去改這個區域變數的值,并不能改變外部的max和min的值。
至于樓上 qzjhjxj 的答案,他在函式引數上,使用 int & (int 型別的參考),這個是 C++ feature,跳過了指標難以理解的地方,但是也有自己的約束,本質就是操作物件的參考等同于操作物件本身。
uj5u.com熱心網友回復:
指標 *max *min 是函式f()內的區域變數,它在記憶體是占了一塊空間的,里面存放的資料是 int max 這個變數的地址值,現在假定這個地址值是0001。然后在f()函式里去比大小,找到了最大的數的地址值假定是1005,我們就把 *max 里存放的值改為了1005,函式執行結束回到主函式時,輸出cout<<"Max: "<<max<<endl; 這里的max 地址值還是0001,并沒有改變。按你的想法,繞一圈,還得是地址,把自己也繞暈了:#include <iostream>
using namespace std;
void f(int &a,int n,int **max,int **min)
{
*max=*min=&a;
for(int i=1;i<n;i++)
{
if(**max<*(&a+i)) *max=(&a+i);
if(**min>*(&a+i)) *min=(&a+i);
}
}
int main()
{
int a[10]={2,5,3,9,0,8,1,7,6,4};
int *max,*min; //這里的兩個指標變數,和函式里的指標雖然同名,但不是同一空間
f(*a,10,&max,&min);
cout<<"Max: "<<*max<<endl;
cout<<"Min: "<<*min<<endl;
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/269360.html
標籤:新手樂園
上一篇:正則怎么寫
