請問指標可以定義外在變數嗎? |
尚未結案
|
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
hi~各位大人:
您們好,I am a very new novice at programming.
我現在程式有一問題,如下: int * AA ( int *A , a , b )
{
... return A ;
} int * BB ( int *B , a , b )
{
... return B;
}
在四個function內都要使用如此的宣告: int * C = new int[x];
C=AA( C, c , d ); int * D = new int[x];
D=BB( D, c , d );
我想把這指邊宣告為 static extern 變數,
可是比如我手上這本旗標出版,施威銘主編,
變數種類,簡單分成auto和static,如:
auto : declaration : stack : It is freed when excution leaves the function.
static: definition : memory : They persist for the entire time a program is running.
請問指標可以用static變數嗎? It's scope可以在好幾個function?
指標是存放一個變數的address,並不是變數本身o 請問若不行,依我這樣子的形勢,怎改比較好,比較快?或者都不行要如何?
請不吝惜指教
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
|
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
kmp 您好: 理論上不管是指標或陣列,均是一個變數,只是它們所存的內容不是一般的數值或字元,而是位址。因此當然可以用extern宣告去使用它們。
所謂的extern宣告,就是說在目前的程式檔中,並不存在這個變數,而是存在另外的檔案中,因此如果要在目前的檔案中引用外部的變數,就可以透過extern將要引用的變數在目前檔案中作宣告,當然有一個前提:就是要引用的外部變數,必須能看得到,也就是說它必須是一個global形式的變數,以確保能存取到該變數,等到程式Link時,就能將它們連結起來,相互為用。
底下程式碼,供參考:
程式分別引用File.c與FileCpp.cpp兩外部檔案中的變數與函式,
//--------------------------------------------------------------------------- // File.c int gCommonC = 6; int valueC() { return 66; } //--------------------------------------------------------------------------- //FileCpp.cpp int gCommonCpp = 9; int valueCpp() { return 99; } //--------------------------------------------------------------------------- // Your project, extern int gCommonC; extern "C" // 如果引入的是.c檔中的函式,要多加此段,引入內容以extern "C" {...}包住,因為C 會自動變更函式的名稱。 { extern int valueC(); // C 容許同名函式,但從C引入者要避免函式名稱遭更改 } extern int gCommonCpp; extern int valueCpp(); void __fastcall TForm1::BitBtn1Click(TObject *Sender) { ShowMessage( gCommonC ); ShowMessage( valueC() ); ShowMessage( gCommonCpp ); ShowMessage( valueCpp() ); } //---------------------------------------------------------------------------我之所以不解的地方是: int * C = new int[x]; C=AA( C, c , d ); 上面以動態方式宣告了陣列C,而後被當成參數傳入函式AA(.),最後AA(.)的傳回值又改寫了C,這就有可能導致C原先配置的記憶體,無法釋放。 這樣做的目的是我無法理解的原因所在。 |
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
引言: 我之所以不解的地方是: int * C = new int[x]; C=AA( C, c , d ); 上面以動態方式宣告了陣列C,而後被當成參數傳入函式AA(.),最後AA(.)的傳回值又改寫了C,這就有可能導致C原先配置的記憶體,無法釋放。 這樣做的目的是我無法理解的原因所在。 發表人 - >>< face="Verdana, Arial, Helvetica"> hi~richtop: 您好,謝謝您用心的解答, 我先回答您這一問題,因為這可能是我寫錯,因為我怎想, 但我不會寫程式,寫出來是錯的,若有錯請您糾正 > <> 我是想,> <> 我不知您懂我的意思嗎?我也不知這可不可用,因為其實它可以改寫 成一 > > |
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
kmp 您好: 如果您是希望將陣列傳入函式計算,並能取回原陣列的話(我還是一直覺得您是要這樣做?),
我個人是傾向於建議將陣列以參數的方式傳入,並附加上該陣列的大小。
當陣列以參數傳遞時,僅是傳該陣列的起址位址,我們無從判斷該陣列的大小,
但所有對陣列的修改都直接反應在該陣列上,因為我們真的到該陣列所在記憶體中去修改其內容,
這也就是我為何不用傳回原陣列位址的原因。
底下有程式碼,請參考:
// file1.cpp void outsideSub(int *ary, int len, int value) { for (int k=0; kRichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### |
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
ENIX007 您好: 我之所以不解與不鼓勵這種寫法的原因如下之說明,請參考。
除非這函式的目的就是傳回一個資料的位址(指標)。我的意思就是這樣。
< class="code">
int * AA ( int *A , a , b )
{
... return A ;
} int * C = new int[x]; // C指向一塊系統配置的記憶體
C=AA( C, c , d ); // 回傳值會改變C的值,如果仍與原先的值相同,那似乎就不必多此一舉;如果不是,C原先指到的記憶體區塊就漏失掉了。
引言: 如果說new出來的int陣列在同一個scope做delete的話,應該是不會造成記憶體 流失才對,因為函式傳入時是指標型態,回傳也是指標,更動的都是同一個記憶體 區塊,int *A仍然指向同一個位址...(不曉得richtop大大您指的是哪種情形呢?)RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### |
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
嗯...
如同richtop大大所述,按照kmp大大您的用法
引言: int * AA ( int *A , a , b ) { ... return A ; } int * C = new int[x]; C=AA( C, c , d );AA函式只需要這樣就夠了 void AA ( int *A , a , b ) { ... } 不需要傳入re_A,因為當主程式(假設)呼叫AA函式後,回到主程式時C陣列就已經 改變了... 謝謝richtop大大的解說 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~ |
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
hi~richtop :
您好,謝謝您出一作業給我,如下 >
及請不吝惜指教 ^^" >
>
>
>
>>
>
>
}
//--------------------------------------------------------------------------- result="">請問這cat_printf ,如我可以寫一function:
但是使用這函數呼叫方式好像跟您不一樣,您那樣是好像是寫成一
structure的member,是可以為函數,但是您沒宣告structureㄚ??
我可能問的問題很好笑,請多包含o void dog_printf(int s)
{ printf("hi~\n");
printf("This is my % hw!",s);
}
ShowMessage(result);
}
請問這一程式我可以看出傳指標和傳一array給一空間有什不同優點嗎?
原諒我的不敏,我也不知那extern outsideSub(int*, int, int);
是因為outsideSub(int*, int, int);宣告在不同file,
要用的有點像#include嗎? 若寫在同一file就不用如此宣告嗎?
以及,我之前有一錯,void AA ( int *A , a , b , *re_A ),*re_A忘記寫型別,
應該如 int *re_A ,extern outsideSub(int*, int, int);是不是也少了type?
從前文討論,這是有點像 function是在使用記錄 返回位址,和 macro是把作的程
式碼塞入原主程式,增加空間,但速度快,有沒有異曲同工?? > 發表人 -
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
kmp 您好: 原想將所有問題以此範例一併說明,因此引東論西,不料最後竟演變成畫蛇添足的結果。在此致歉!
<>< face="Verdana, Arial, Helvetica">引言:
hi~richtop :
您好,謝謝您出一作業給我,如下 >
及請不吝惜指教 ^^" >
>
>
><>//此部分就是>
>><>//說明同上。>
>
><>//說明同上。>
}
//--------------------------------------------------------------------------- result="">請問這cat_printf ,如我可以寫一function:
但是使用這函數呼叫方式好像跟您不一樣,您那樣是好像是寫成一
structure的member,是可以為函數,但是您沒宣告structureㄚ??
我可能問的問題很好笑,請多包含o
result是個AnsiString的一個物件,而cat_printf 是其成員函式,用法與C中的printf(.)相同,只是其結果會附加在result後面,我是為了顯示結果偷懶用它,但忘了說明,以致造成困擾。
>
>
>
請問這一程式我可以看出傳指標和傳一>廣義的說,> 原諒我的不敏,我也不知那<>>是的!>
以及,我之前有一錯,>
<>>
從前文討論,這是有點像 >
<>好像有點不一樣。
使用>
> 發表人 - >>< face="Verdana, Arial, Helvetica"> RichTop 敬上 =====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####
|
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
hi~ENIX007:
,您好
很高興您幫我看及解答問題,因為我不太會寫程式,邊寫在看書,
我看您寫的去翻書,晚一點回應,請見諒,有錯也請指教,謝謝>< face="Verdana, Arial, Helvetica">引言:
冒昧插個花
如果說>
我不知有什好書,(若有也懇請介紹)是有書就看,我翻一本,> >我剛來到此版時是為寫功課,看到五顆星,四顆星還有很多像我這樣沒有
>
>
您 > 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
>>< face="Verdana, Arial, Helvetica">
|
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
hi~ENIX007 :
您好,很高興及謝謝>< face="Verdana, Arial, Helvetica">引言:
AA函式只需要這樣就夠了
void AA ( int *A , a , b )
{
...
}
不需要傳入re_A,因為當主程式(假設)呼叫AA函式後,回到主程式時C陣列就已經
改變了...
ㄣ,我同意您的想法,可能是我舉的例子不當,謝謝您的指教o
但因我現在要 寫的程式,要有兩個array,一個是input,一個是output,
所以函數裡面的參數,就好像是窗口,可能進,可能出,若我要一進一出,
宣告void必要有兩參數,若我宣告成函數指標或是可傳回值,則需要再多
一變數去接收它,傳給函數值也一樣,我不知我的想法對不對,以及有沒
誤會兩位大人的意思o Thanks & Regards
kmp
謝謝richtop大大的解說 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
>>< face="Verdana, Arial, Helvetica">
|
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
kmp大大您好
引言: 我不知有什好書,(若有也懇請介紹)是有書就看,我翻一本,C 程式設計與應用- 張耀仁 著,我想對指標的動態記憶體配置有點了解, 它說,"delete這敘述並沒有 將指標一起清除,只回收它指向的記憶體空間o 指標本身佔用的記憶體空間為 unsigned int,雖然無法回收也無所謂" 我想您的意思是不是這樣??1.C&C 完美經典 江義華編著 金禾發行 2.C 聖經(I),C 聖經(II) Robert Lafore著,許建發譯 松格發行 C 聖經不確定買不買的到...小弟個人覺得不錯的書籍... 引言: 如果說new出來的int陣列在同一個scope做delete的話,應該是不會造成記憶體 流失才對,因為函式傳入時是指標型態,回傳也是指標,更動的都是同一個記憶體 區塊,int *A仍然指向同一個位址...(不曉得richtop大大您指的是哪種情形呢?)上述其實也是小弟的疑問,只是藉機請教richtop大大會有何種情形 造成記憶體流失...不過依照您的用法 C=AA( C, c , d ); 只要在AA()函式內不更動到C所指的位址的話,即使回傳也不會造成 錯誤的,只是如同richtop大大所說,"多此一舉" 也就是說記憶體是否會流失是因為在更動C指標指向的位址之前是否有 釋放記憶體(也就是delete [] C)有關,而與函式是否有回傳值無關 小弟只是想釐清這一點... 好像把問題複雜化了,真抱歉 小弟的經驗尚淺,也請多多包涵 <>< face="Verdana, Arial, Helvetica">引言: 但因我現在要 寫的程式,要有兩個array,一個是input,一個是output, 所以函數裡面的參數,就好像是窗口,可能進,可能出,若我要一進一出, 宣告void必要有兩參數,若我宣告成函數指標或是可傳回值,則需要再多 一變數去接收它,傳給函數值也一樣,我不知我的想法對不對,以及有沒 誤會兩位大人的意思o 喔...小弟是誤解成re_A只是回傳您所謂的input,那就與回傳值一樣是多此一舉了, 若是需要另一個output,那當然必須傳入2個參數... 引言: 我剛來到此版時是為寫功課,看到五顆星,四顆星還有很多像我這樣沒有 stars的,都好可愛,有的都拿小時後照片,漫畫,心裡想,我媽也把我小時候生的 很古錐,我也要,...還沒,所以,這多勵害的版上大人都是小孩子,我這...不敢同 言語,若有,還在媽媽肚子裡,我..,在下,小的是小小o 我有很多不會,不懂,理解力記憶力都不行, richtop 大人解答都會出考題, 我open book好久還是不會,小的請您下次稱呼在下kmp 就好,謝謝o我想網路上的基本禮儀,便是"相互尊重"... 只要發言,就必定十分注意說話的語氣與用詞... 只要是說話有禮(有理)的,都是"大大"... 否則,我可以選擇不發言... 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~ |
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
hi~ENIX007 :
您好,很感謝您用心的回答,我本來也想少回應一篇,一合為一,
因為已經不小心超過十,再多一或少一可能沒差,沒想到您做到了o 以下是我對您認真的回覆有話想說 <>< face="Verdana, Arial, Helvetica">引言:
1.C&C 完美經典 江義華編著 金禾發行
2.C 聖經(I),C 聖經(II) Robert Lafore著,許建發譯 松格發行
C 聖經不確定買不買的到...小弟個人覺得不錯的書籍...
謝謝,我覺一本好的工具書也很重要o
以下這段您特別用紅色,我有特別再看一次,有比較清楚,十分謝謝o C=AA( C, c , d );
只要在AA()函式內不更動到C所指的位址的話,即使回傳也不會造成
錯誤的,只是如同richtop大大所說,"多此一舉"
也就是說記憶體是否會流失是因為在更動C指標指向的位址之前是否有
釋放記憶體(也就是delete [] C)有關,而與函式是否有回傳值無關
小弟只是想釐清這一點...
好像把問題複雜化了,真抱歉
小弟的經驗尚淺,也請多多包涵< >
<>
我其實很高興,可能我寫的程式是因我的 >
> 喔...小弟是誤解成>
關於這,是我的表達能力不太好,造成大家有點不清楚,> 我想網路上的基本禮儀,便是"相互尊重"...
只要發言,就必定十分注意說話的語氣與用詞...
只要是說話有禮(有理)的,都是"大大"...
否則,我可以選擇不發言...< >
<>
了解,第一次和 >
>>
|
kmp
一般會員 發表:17 回覆:51 積分:13 註冊:2004-07-24 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |