全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1256
推到 Plurk!
推到 Facebook!

C++指標問題

答題得分者是:dllee
asd98537
一般會員


發表:27
回覆:25
積分:10
註冊:2002-10-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-29 23:00:10 IP:163.25.xxx.xxx 未訂閱
int a = 4; int *p2a = &a; a=5; cout<<*p2a; ==> 印出5 BCB下 Edit1->Text = "this is a test"; AnsiString *p2e = &(Edit1->Text); Label1->Caption = *p2e; 為什麼Label1->Caption卻沒東西或是印出亂碼? 謝謝
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-29 23:12:07 IP:140.135.xxx.xxx 未訂閱
asd98537您好: 試試改成這樣   
 Edit1->Text = "this is a test";
 AnsiString str=Edit1->Text;
 AnsiString *p2e = &(str);
 Label1->Caption= (*p2e) ; 
 
順心 <>~我也是在學習的階段,所以請您多多見諒與指教~
asd98537
一般會員


發表:27
回覆:25
積分:10
註冊:2002-10-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-29 23:35:26 IP:163.25.xxx.xxx 未訂閱
謝謝你的回覆 請問不能直接 AnsiString *p2e = &(Edit1->Text); 的原因何在? 謝謝
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-29 23:45:56 IP:61.224.xxx.xxx 未訂閱
引言: int a = 4; int *p2a = &a; a=5; cout<<*p2a; ==> 印出5 BCB下 Edit1->Text = "this is a test"; AnsiString *p2e = &(Edit1->Text); Label1->Caption = *p2e; 為什麼Label1->Caption卻沒東西或是印出亂碼? 謝謝
在 BCB 中所有的元件都有 property ,而在 property 中可以分 read 及 write,例如: Edit1->Text 我們可以由線上說明得到: __property AnsiString Text = {read=GetText, write=SetText}; 表示,當我們作: Edit1->Text="this is a test"; 時,就相當於: Edit1->SetText("this is a test"); 而當我們作: AnsiString asTemp=Edit1->Text; 時,就相當於 AnsiString asTemp=Edit1->GetText(); 在您的 code 中 Edit1->Text = "this is a test"; AnsiString *p2e = &(Edit1->Text); Label1->Caption = *p2e; 紅色的部分,可以說是不會在 BCB 中使用的,對於 Label1 的 Caption 同樣也是在 read/write 時叫用不同函式而來,而 &(Edit1->Text) 會取到的指標等於是 Edit1->GetText() 函式所傳回的 AnsiString 的指標,我想,一般 coding 應該是不會用到取回傳值的指標吧,所以 &(Edit1->Text) 之類的 code 是不應該出現的。 如果您想要用字串的指標來傳資料,那可以改成以下的 code Edit1->Text = "this is a test"; char *p2e = Edit1->Text.c_str(); Label1->Caption = p2e; 而在最後一行,將一個 char pointer 指定給 AnsiString 時,其實就相當於 Label1->Caption = AnsiString(p2e); 因為 AnsiString 本身是一個強大的轉換器,可以將很多資料轉成字串,如以上的 code 可以在 Label1 看到 this is a test 如果您想要直接類比 int 的運算,我想,應直接用 AnsiString 取代 int,如下: AnsiString a = "this is 4"; AnsiString *p2a = &a; a="This is 5"; Label1->Caption = *p2a; 最後再使用 Label 或其他元件來顯示結果。如此可以從 Label1 看到 This is 5 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://big5.to/吃軟也吃硬 http://coolsite.to/ushells 介紹Shells,LiteStep,GeoShell.... 發表人 - dllee 於 2003/04/29 23:48:20
------
http://www.ViewMove.com
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-29 23:58:25 IP:140.135.xxx.xxx 未訂閱
我又學到了不少,謝謝dllee大哥< >< > ~我也是在學習的階段,所以請您多多見諒與指教~
asd98537
一般會員


發表:27
回覆:25
積分:10
註冊:2002-10-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-30 00:00:38 IP:163.25.xxx.xxx 未訂閱
感謝dllee大大詳細的說明 有沒有辦法作到 用某個變數str來代表Edit1->Text 然後不管Edit1->Text怎麼變動 存取str時都是代表Edit1->Text裡最新的值 就像是str是Edit1->Text的參考一樣 發表人 - asd98537 於 2003/04/30 00:02:27
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-30 00:11:26 IP:140.135.xxx.xxx 未訂閱
asd98537您好:    
引言: 有沒有辦法作到 用某個變數str來代表Edit1->Text 然後不管Edit1->Text怎麼變動 存取str時都是代表Edit1->Text裡最新的值 就像是str是Edit1->Text的參考一樣
您指的是這樣嗎??
AnsiString str=Edit1->Text;
AnsiString *p2e =&(str);
Label1->Caption= (*p2e) ; 
順心 <>~我也是在學習的階段,所以請您多多見諒與指教~
asd98537
一般會員


發表:27
回覆:25
積分:10
註冊:2002-10-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-30 00:32:57 IP:163.25.xxx.xxx 未訂閱
我的意思是 不管Edit1->Text怎麼變動,我用*p2e取出的都是最新值,而不是它之前舊的複本 AnsiString str=Edit1->Text;AnsiString *p2e =&(str);Label1->Caption= (*p2e) ; 這樣作的話,當Edit1->Text的值更動,*p2e的值只是它之前的copy 舉個例子 form上拉個Edit元件,在unit1.h中class TForm1裡會有這一行 __published: TEdit *Edit1; 我寫 TEdit *p2e = Edit1; 當Edit1->Text變數 p23->Text會取到其變動的值 那能不能類比 我用一個AnsiString *p2a = &(Edit1->Text)//假設這樣可以的話,實際上如dllee大哥說的行不通 *p2a的值會隨著Edit1->Text變動而變動 這就是我的原意
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-30 00:54:07 IP:140.135.xxx.xxx 未訂閱
asd98537您好:   我有點看不太懂您的意思...   您說要*p2a的值會隨著Edit1->Text變動而變動 而依您原題目的意思,在BCB要呈現: Edit1中輸入5結果在Label1也呈現5 下面的方式可以做到啊^^? 假如之後Edit1中改成6,Label1就呈現6...
AnsiString str=Edit1->Text;
         AnsiString *p2e =&(str);
         Label1->Caption= (*p2e) ;  
   
您說這樣作的話,當Edit1->Text的值更動,*p2e的值只是它之前的copy 我不了解您說的copy指的是什麼耶... 還是您指的是這樣
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
 AnsiString str=Edit1->Text;
 AnsiString *p2e =&(str);
 Label1->Caption= (*p2e) ;
} 
順心 <>~我也是在學習的階段,所以請您多多見諒與指教~ 發表人 -
brant
一般會員


發表:1
回覆:64
積分:23
註冊:2003-04-07

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-04-30 10:01:48 IP:211.21.xxx.xxx 未訂閱
引言: 我的意思是 不管Edit1->Text怎麼變動,我用*p2e取出的都是最新值,而不是它之前舊的複本 AnsiString str=Edit1->Text;AnsiString *p2e =&(str);Label1->Caption= (*p2e) ; 這樣作的話,當Edit1->Text的值更動,*p2e的值只是它之前的copy 舉個例子 form上拉個Edit元件,在unit1.h中class TForm1裡會有這一行 __published: TEdit *Edit1; 我寫 TEdit *p2e = Edit1; 當Edit1->Text變數 p23->Text會取到其變動的值 那能不能類比 我用一個AnsiString *p2a = &(Edit1->Text)//假設這樣可以的話,實際上如dllee大哥說的行不通 *p2a的值會隨著Edit1->Text變動而變動 這就是我的原意
沒有辦法的,因為這樣的操作違反了 OO 資料封裝的原則 會衍生出非常多的問題跟麻煩 所以 VCL 應該會把它內部存放真實資料的變數宣告為 private 就算要他傳指標出來也會帶上 const 修飾詞 而且傳出來的不一定就是直接指到內部資料的指標。 (我沒去看 TEdit 的原始碼,以上是依 OO Programming 的思考模式回答。)
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-04-30 11:51:40 IP:61.231.xxx.xxx 未訂閱
to asd98537, 我想,您想要的東西可能需要自己作出來才行,如果是用別人的 code ,您很難保證傳出的指標是不變的(就算是它可以傳出存放資料的指標)。 為什麼呢? 如果您有注意的話,一些 VCL 元件有 Capacity 的屬性,這個 Capacity 表示目前它最多可以存放的量有多少,而當存放的量大於這個值時,它就會重新配置一塊記憶體並將舊資料移到新的記憶體,在使用上,您完全不知道它會如何處理... 當重新配置一塊記憶體的同時,就表示之前您所記錄的指標已經是無效了,必需重新取得。以 AnsiString 來說,就得重新叫用 c_str() 取得目前存放資料的指標。 如果 code 是您自己寫的,您可以在一開始就 new 一個不可能用到的「大」空間,以確保指標不需要改變... 但除非您很確的所用到的量,否則這樣作只是浪費記憶體。 用指標確實可以省下許多 code ,看起來很簡潔,但可不要用過頭了。 我們要玩指標,不要被指標玩喔 < >< > 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://big5.to/吃軟也吃硬 http://coolsite.to/ushells 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
系統時間:2024-05-05 18:16:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!