→ whitelittle:原來書有寫,compiler會自動給予s正確位址 140.113.92.244 08/01
→ whitelittle:原來書有寫,compiler會自動給予c正確位址 140.113.92.244 08/01
推 linkermlin:應該先分配內存空間! 210.83.242.69 08/01
→ linkermlin:否則c指向一個靜態的字符數組,不能進行寫操! 210.83.242.69 08/01
推 UNARYvvv:"abc" 這個東西就是一個位址 61.70.137.117 08/01
> -------------------------------------------------------------------------- <
作者: UNARYvvv (有趣生活) 看板: C_and_CPP
標題: Re: [問題] 請問指標的問題
時間: Mon Aug 1 23:40:24 2005
※ 引述《whitelittle (小白)》之銘言:
: char *c;
: c = "abc";
: 請問這樣是不是不好的用法,我會這麼問是因為以下的例子:
實際上沒什麼問題
雖然 c 的型態是 char *
但是這樣 c 指向的內容("abc")仍然不可被間接改變
要注意的是
c 本身可能會被改變 (改指向別的字串/字元)
: int *i;
: i = 2;
: 我在書上看到,他說由於i尚未得到一個合法的位址,就把1assign給i
: 這樣是不正確的用法,...
問題不在這
而是 i 的型態是 int *
2 是代表一個 int
若直接這樣指定,則 C++ 編譯器會視為錯誤
因為 C++ 對指標型別會嚴格檢查
----------
但是從你的問題來看
似乎你本來是要問 *i=2; 這樣吧??
如果是寫 *i=2; 那當然不妙,因為 i 一開始指向的是未知位址
甚至可能是不可存取的位址,間接設定 i 指向的東西
就很可能造成程式終止
: 請教各位大大 謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.70.137.117
推 freehaha:補充一下 2 其實應該是 const int :D 218.165.124.29 08/01
→ freehaha:總而言之~pointer是很神奇的東西 :) 218.165.124.29 08/01
→ ijen73:c="abc" 這樣真的行嗎? 203.73.182.56 08/02
推 UNARYvvv:可以。何不試驗一下呢^^ 61.70.137.117 08/02
→ ijen73:c="abc"我知道可以,我的意思是這是非常糟的寫法 61.63.29.253 08/02
→ ijen73:不管什麼理由,它都不應該存在程式中 61.63.29.253 08/02
推 UNARYvvv:原來是質疑~ 嗯,要用通常應該宣告 const char* 61.70.137.117 08/02
→ UNARYvvv:感謝指教 61.70.137.117 08/02
→ ijen73:您客氣了 61.63.29.253 08/02
> -------------------------------------------------------------------------- <
作者: UNARYvvv (有趣生活) 看板: C_and_CPP
標題: Re: [問題] 請問指標的問題
時間: Tue Aug 2 01:33:21 2005
推 freehaha:補充一下 2 其實應該是 const int :D 218.165.124.29 08/01
嗯..我也同意,剛沒想到 const 特性,只想著型別~thanks
=======
題外話~
剛才我又試驗一下
以下這段 code:
-----
const int ci=2;
int *p1,*p2;
p1 = ci;
p2 = 2;
-----
然後在幾個不同環境編譯測試,得到的錯誤訊息如下:
VC 6:
error C2440: '=' : cannot convert from 'const int' to 'int *'
error C2440: '=' : cannot convert from 'const int' to 'int *'
VC .NET 2003:
error C2440: '=' : 無法從 'const int' 轉換到 'int *'
error C2440: '=' : 無法從 'int' 轉換到 'int *'
C++ Builder 6:
[C++ Error] ...: E2034 Cannot convert 'const int' to 'int *'
[C++ Error] ...: E2034 Cannot convert 'int' to 'int *'
Dev-Cpp(gcc)
error: invalid conversion from `int' to `int*'
error: invalid conversion from `int' to `int*'
可見,某些編譯器給的錯誤訊息
可能會不包含辨識 const 的資訊
也就是即使把一個 const int 指定給不符型態的變數
編譯器仍然可能只說是個 int 而已...
從 VC.NET 2003 和 C++ Builder 6 給的錯誤訊息來看
原來它們對「2」,和對一個「const int 變數」,給的錯誤訊息不同
而 VC6 跟 gcc 則是一視同仁,不過 gcc 則都沒有列出 const
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.70.137.117
※ 編輯: UNARYvvv 來自: 61.70.137.117 (08/02 01:37)
> -------------------------------------------------------------------------- <
作者: UNARYvvv (有趣生活) 看板: C_and_CPP
標題: Re: [問題] 請問指標的問題
時間: Tue Aug 2 10:13:33 2005
※ 引述《gocpp (cpp)》之銘言:
: ※ 引述《UNARYvvv (有趣生活)》之銘言:
: : 實際上沒什麼問題
: : 雖然 c 的型態是 char *
: : 但是這樣 c 指向的內容("abc")仍然不可被間接改變
: : 要注意的是
: : c 本身可能會被改變 (改指向別的字串/字元)
: 這裏有個小地方。實際上字面字串(c 所指)的內容能不能改變
: 要看編譯器的實作,不過既然和編譯器實作有關就該避免這種用
: 法。要改變的話,先複製一份實體再對複製體進行操作才是正確
: 的方法。
: 想測試能不能改變,可以試試看:
: std::cout << ("abc"[0] = 'z');
: 在 BCB6 上居然還可以跑。比較新一點的編譯器應該是不允許這
: 種用法了。
那可以設定
因為 project options 裡面
預設的 language compliance 是 Borland
如果改成 ANSI
上面那行就會給 "E2024 Cannot modify a const object" 錯誤訊息
所以 Borland 也知道標準是如何
偏偏自家提供了這種 extension (or defect!?)
至於 "abc"[0] = 'z' 這個動作,也就是修改 string literal 的內容
剛剛查了一下應該是 undefined
所以的確是看編譯器實作沒錯
感謝指正~
: : 問題不在這
: : 而是 i 的型態是 int *
: : 2 是代表一個 int
: : 若直接這樣指定,則 C++ 編譯器會視為錯誤
: : 因為 C++ 對指標型別會嚴格檢查
: 嘗試將 i 指向 (const) int 或 const int * 的變量都是不合法的
^^^^^^^^^^^^^^^^^^^^^
i 是個 int* 為何不能指向 int ??
(指向 const int 則當然不行,但你已括起來就不提)
還是你的意思是指派 (assign) ?
如此用「指向」有點混淆..:p
: 總之,不論 *(指標)或 const 都是「型別」的一部份,不完全相
: 符的話,不能亂轉。
同意
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.70.137.117
※ 編輯: UNARYvvv 來自: 61.70.137.117 (08/02 10:19)
> -------------------------------------------------------------------------- <
作者: lichihwu (波特多) 看板: C_and_CPP
標題: Re: [問題] 請問指標的問題
時間: Tue Aug 2 11:02:23 2005
※ 引述《gocpp (cpp)》之銘言:
: ※ 引述《UNARYvvv (有趣生活)》之銘言:
: : ^^^^^^^^^^^^^^^^^^^^^
: : i 是個 int* 為何不能指向 int ??
: : (指向 const int 則當然不行,但你已括起來就不提)
: : 還是你的意思是指派 (assign) ?
: : 如此用「指向」有點混淆..:p
: int * 代表某個指標,指向某個型別為 int 變數的「起始位址」
int* p;
p是個變數,型態是指標,用來參考一個記憶體位置,該位置的資料被解釋為int型態。
int i;
i是個變數,型態是整數。
說起來,指派(assign)一個指標變數時,我們說指向。
但這和指派(assign)整數變數所做的是一樣的,只是給的是個記憶體位置…
: 當然變數的位址,實際上是個整數。但直接說 int * 指向 int
: 這樣不太好吧?畢竟一個是位址,一個是內容,完全是兩回事啊。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.84.97.227
> -------------------------------------------------------------------------- <
作者: khoguan (Khoguan Phuann) 看板: C_and_CPP
標題: Re: [問題] 請問指標的問題
時間: Tue Aug 2 12:52:28 2005
※ 引述《UNARYvvv (有趣生活)》之銘言:
: 推 freehaha:補充一下 2 其實應該是 const int :D 218.165.124.29 08/01
: 嗯..我也同意,剛沒想到 const 特性,只想著型別~thanks
2 這鍋 integer literal 它的型別其實仍然只是 int
ISO/IEC 14882:2003
2.13.1 Integer literals
paragraph 2:
The type of an integer literal depends on its form, value, and suffix.
If it is decimal and has no suffix, it has the first of these types
in which its value can be represented: int, long int; if the value
cannot be represented as a long int, the behavior is undefined.
If it is octal or hexadecimal and has no suffix, it has the first of
these types in which its value can be represented: int, unsigned int,
long int, unsigned long int. If it is suffixed by u or U, its type is
the first of these types in which its value can be represented:
unsigned int, unsigned long int. If it is suffixed by l or L, its type
is the first of these types in which its value can be represented:
long int, unsigned long int. If it is suffixed by ul, lu, uL, Lu, Ul,
lU, UL, or LU, its type is unsigned long int.
-------------------------------
半吊子 language lawyer 亂入……
--
※ 發信站: 批踢踢實業坊(ptt.cc)
※ 編輯: khoguan 來自: 220.130.208.168 (08/02 12:56)
推 jeunder:哇~ 2003版的耶! 我的都還是1998版的說... 61.64.100.236 08/02
推 UNARYvvv:呼 正確答案終於出來了~ 61.70.137.117 08/02
推 freehaha:原來是這樣阿 lol 218.165.143.8 08/04
→ freehaha:我還害U大多PO了一篇 :p 218.165.143.8 08/04
> -------------------------------------------------------------------------- <
作者: UNARYvvv (有趣生活) 看板: C_and_CPP
標題: Re: [問題] 請問指標的問題
時間: Tue Aug 2 17:08:10 2005
※ 引述《gocpp (cpp)》之銘言:
: ※ 引述《UNARYvvv (有趣生活)》之銘言:
: : ^^^^^^^^^^^^^^^^^^^^^
: : i 是個 int* 為何不能指向 int ??
: : (指向 const int 則當然不行,但你已括起來就不提)
: : 還是你的意思是指派 (assign) ?
: : 如此用「指向」有點混淆..:p
: int * 代表某個指標,指向某個型別為 int 變數的「起始位址」
: 當然變數的位址,實際上是個整數。但直接說 int * 指向 int
: 這樣不太好吧?畢竟一個是位址,一個是內容,完全是兩回事啊。
我知道變數位址實際上是個整數,但我並沒有講到那方面
建議翻一下 K&R 2/e
SECTION 5.1 p.93~94
The unary operator & gives the address of the addresss
of an object, so the statement
p = &c;
assigns the address of c to the variable p,
and p is said to "point to" c.
請不要把「指派」跟「指向」混在一起
如上所說,"p is said to ""point to"" c"
它說「p (一個 char*) 指向 c (一個 char)」
這跟我先前問你「int* 為何不能指向 int」是一樣的意思
這同時也回答了你前篇回我「直接說 int * 指向 int 這樣不太好吧?」
指標代表的(儲存的)就是一個位址
記憶體中在該位址上的資料,就是被這個指標指向的內容
指標指的是某位址上的內容,而不是說指標指向目標內容的位址
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.70.137.117
> -------------------------------------------------------------------------- <
1. char* string
是屬於 C-Style string
用法並不會危險
會危險是因為你沒有管好你的指標
為了避免不必要的使用衝突
memory 的 alloc 跟 free 在很多情況下都是必要的
2. 指標 P 所儲存的是一個位址 A
該位址 A 所儲存的是一個變數 B 的內容
我們說 " P 指向 B " ( P point to B )
B 的資料型態及所代表的數值是由你所預先設定的規則來作描述
該指標的大小
將視你的硬體及作業系統所藉定
a.記憶體空間定址能力
b.記憶體資料處理能力
ex1. 你在一台 286 上是不可能裝 Win95 的
ex2. 你在一台 Pentium 4 上裝 MS-DOS 3.3,硬體效能必然打折
3. 不管是指向 char、short int、long int
還是指向 struct、union
甚至是指向 function 跟 const string
指標都是一種變數型態
他存的資料,都要經過你的手動辨識
才知道他存的資料是代表啥
32位元記憶體位址表示跟32位元整數表示是一樣的
都是三十二位元
只是看你怎麼定義
4. variable[array] == array[variable]
雖然在 C 語言的語法規則上並不成立
但是在 Assembly Language 裡頭卻是有效的
詳情請參閱組合語言的記憶體定址法
indexd addressing 跟 based addressing
還有兩者混用的情況
也因此在 Borland C++ Builder 跟 Visual C++ 6.0 裡頭
這樣的用法是可以被允許的
5. 一般來說
指派是 assign,是 value = value
指向是 point to,是種 value = address
A assign to B,是 B = A
A point to B,是 A = &B
請注意 lvalue,rvalue 跟其資料所代表的意義
※ 編輯: gaber 來自: 61.219.186.154 (08/04 15:11)
> -------------------------------------------------------------------------- <
作者: UNARYvvv (有趣生活) 看板: C_and_CPP
標題: Re: [問題] 請問指標的問題
時間: Thu Aug 4 15:43:47 2005
※ 引述《gaber》之銘言:
: 4. variable[array] == array[variable]
: 雖然在 C 語言的語法規則上並不成立
咦?
variable[array]
=> *(array + variable) => 所以先後順序無關喔
array[variable]
不會不成立
: 但是在 Assembly Language 裡頭卻是有效的
: 詳情請參閱組合語言的記憶體定址法
: indexd addressing 跟 based addressing
: 還有兩者混用的情況
在 assembly 裡面是可用沒錯,但是也跟 C 並不一樣啊
位址做運算也不會像 C 一樣會牽扯到變數型態大小
而且請問 assembly 裡面有效,跟在 BCB/VC 裡頭被允許..
上下兩者有何因果關係呢??
: 也因此在 Borland C++ Builder 跟 Visual C++ 6.0 裡頭
: 這樣的用法是可以被允許的
那可以不要用 VC 跟 BCB,然後來測一下:
int a[3]={1,2,3}, b=0, c=1;
printf("%d %d\n%d %d\n", a[b],b[a], a[c],c[a]);
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.70.137.117
> -------------------------------------------------------------------------- <
作者: extramove (extramove) 看板: C_and_CPP
標題: Re: [問題] 請問指標的問題
時間: Fri Aug 5 08:44:15 2005
※ 引述《gocpp (cpp)》之銘言:
: ※ 引述《gaber》之銘言:
: : 是屬於 C-Style string
: : 用法並不會危險
: : 會危險是因為你沒有管好你的指標
: : 為了避免不必要的使用衝突
: : memory 的 alloc 跟 free 在很多情況下都是必要的
: 並不是說 C 字串危險,而是:
: char *c = "abc";
: 這的確是不好的用法,請愛用 const
: const char s[] = "abc";
不好意思,可以請問一下:
有無const的差別在哪?
以前都只會int,char,float,double,struct,.....
但有時編譯的時後,會出現什麼can't convert from constxxx to xxx
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.139.164.162
> -------------------------------------------------------------------------- <
作者: renderer (rendering) 看板: C_and_CPP
標題: Re: [問題] 請問指標的問題
時間: Fri Aug 5 11:24:46 2005
※ 引述《extramove (extramove)》之銘言:
: ※ 引述《gocpp (cpp)》之銘言:
: : 並不是說 C 字串危險,而是:
: : char *c = "abc";
: : 這的確是不好的用法,請愛用 const
: : const char s[] = "abc";
: 不好意思,可以請問一下:
: 有無const的差別在哪?
: 以前都只會int,char,float,double,struct,.....
: 但有時編譯的時後,會出現什麼can't convert from constxxx to xxx
加了 const 是告訴 Compiler 那筆資料被設成定值了
Compiler 會幫你把關 如果其他地方的程式試圖改變那筆資料
Compiler 就會提醒你不能這麼做 如:
const float PI = 3.141592654f;
PI += 1.0f; // 這行 Compiler 就不會讓你過了
而你不能把 const variable 的指標 assign 給 一般 variable 的指標 如:
const char* NAME = "許\功\蓋\";
char* theName = NAME; // 這行 Compiler 不給過的
因為 theName 是可以改變字串內容的
theName[0]='K'; 是被允許的
但 NAME[0]='K'; 是不允許的
Compiler 不許「由嚴入寬」
can't convert from constxxx to xxx 大概是這個意思
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.228.216.204
※ 編輯: renderer 來自: 61.228.216.204 (08/05 11:37)
※ 編輯: renderer 來自: 61.228.216.204 (08/05 11:39)
> -------------------------------------------------------------------------- <
作者: gaber (老。人渣爵士) 看板: C_and_CPP
標題: Re: [問題] 請問指標的問題
時間: Tue Aug 9 09:37:03 2005
※ 引述《UNARYvvv (有趣生活)》之銘言:
: ※ 引述《gaber》之銘言:
: : 4. variable[array] == array[variable]
: : 雖然在 C 語言的語法規則上並不成立
: 咦?
: variable[array]
: => *(array + variable) => 所以先後順序無關喔
: array[variable]
: 不會不成立
如果那個 variable 是屬於一個 array (variable collection) 之中呢
你要怎麼讓 variable[array] == array[variable] ??
我蠻想知道的~~~~
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.219.186.154
> -------------------------------------------------------------------------- <
作者: UNARYvvv (有趣生活) 看板: C_and_CPP
標題: Re: [問題] 請問指標的問題
時間: Tue Aug 9 11:54:18 2005
※ 引述《gaber (老。人渣爵士)》之銘言:
: ※ 引述《UNARYvvv (有趣生活)》之銘言:
: : 咦?
: : variable[array]
: : => *(array + variable) => 所以先後順序無關喔
: : array[variable]
: : 不會不成立
: 如果那個 variable 是屬於一個 array (variable collection) 之中呢
: 你要怎麼讓 variable[array] == array[variable] ??
: 我蠻想知道的~~~~
我也想知道~
要這樣改的話,那就應該算是 array[array] 了
這樣編譯可以過嗎?
而在 assembly 變成類似 base indexed,實際上內容是兩個 base 相加
就算組譯過了,這樣執行保證不會出錯嗎?
可以舉個例子嗎?那樣比較容易了解
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.70.137.117
※ 編輯: UNARYvvv 來自: 61.70.137.117 (08/09 12:32)
> -------------------------------------------------------------------------- <
作者: gaber (老。人渣爵士) 看板: C_and_CPP
標題: Re: [問題] 請問指標的問題
時間: Wed Aug 10 16:15:27 2005
※ 引述《UNARYvvv (有趣生活)》之銘言:
: ※ 引述《gaber (老。人渣爵士)》之銘言:
: : 如果那個 variable 是屬於一個 array (variable collection) 之中呢
: : 你要怎麼讓 variable[array] == array[variable] ??
: : 我蠻想知道的~~~~
: 我也想知道~
: 要這樣改的話,那就應該算是 array[array] 了
: 這樣編譯可以過嗎?
: 而在 assembly 變成類似 base indexed,實際上內容是兩個 base 相加
: 就算組譯過了,這樣執行保證不會出錯嗎?
: 可以舉個例子嗎?那樣比較容易了解
只要在 variable 屬於一個 variable collection 之中
variable[variable-collection] == variable-collection[variable]
會是個 wrong statement
因為 parser 會解析錯誤
所以必須要透過另一個 pointer 來完成這個動作
而在組合語言
所有的結構體都是透過 base、index、offset 來完成
varable 跟 variable-collection 都會被視為一個記憶體位址
[bs][bp]offset 或是 [si][di]offset 組譯通常是不會過
必須利用 [bs/bp][si/di]offset 來完成這個動作
二維以上的 array 在組語裡頭更會是個行數不少的 statement
http://www.amd.com/us-en/assets/content_type/
white_papers_and_tech_docs/24594.pdf
(asm code 跟 machine code 的對照~~~~)
※ 編輯: gaber 來自: 61.219.186.154 (08/10 16:42)
> -------------------------------------------------------------------------- <
作者: UNARYvvv (有趣生活) 看板: C_and_CPP
標題: Re: [問題] 請問指標的問題
時間: Wed Aug 10 21:35:47 2005
※ 引述《gaber (老。人渣爵士)》之銘言:
: ※ 引述《UNARYvvv (有趣生活)》之銘言:
: : 我也想知道~
: : 要這樣改的話,那就應該算是 array[array] 了
: : 這樣編譯可以過嗎?
: : 而在 assembly 變成類似 base indexed,實際上內容是兩個 base 相加
: : 就算組譯過了,這樣執行保證不會出錯嗎?
: : 可以舉個例子嗎?那樣比較容易了解
: 只要在 variable 屬於一個 variable collection 之中
: variable[variable-collection] == variable-collection[variable]
: 會是個 wrong statement
expression
: 因為 parser 會解析錯誤
: 所以必須要透過另一個 pointer 來完成這個動作
還是沒有舉出實際的例子..麻煩請舉個一兩行實際 C code 好嗎?
先前我就是不清楚
你上次說 array
但後面又加註 "(variable-collection)" 是什麼意思
還是指一般的 array 嗎?
但這次你又沒寫 "array" 了
而且我先前說
arr[var] => var[arr] => *(arr+var)
是要說明:順序不重要,因為最後是相加的
前提是 var 不是 array type
(不然我就不用以 array 和一般 variable 來分了)
不好意思
一直沒搞懂你確切的意思~麻煩了
: 而在組合語言
: 所有的結構體都是透過 base、index、offset 來完成
: varable 跟 variable-collection 都會被視為一個記憶體位址
: [bs][bp]offset 或是 [si][di]offset 組譯通常是不會過
: 必須利用 [bs/bp][si/di]offset 來完成這個動作
: 二維以上的 array 在組語裡頭更會是個行數不少的 statement
bs !!??
應該是 bx 吧?
不過如果是在現在常見的 IA-32 architecture 的話
在 protected mode 下
使用 indirect addressing mode
並沒有那個必須以 base register 搭配 index register 的限制
只要使用 general-purpose register 來搭配即可
剛才寫個小程式,測試時用 VC
因為使用到 VC 提供的 inline assembly 語法。
#include <stdio.h>
int main(){
char count=3, *var="123";
__asm {
mov esi,var
xor edi,edi
mov ecx,3
showvar:
push [esi][edi] ; 也可寫 push [esi+edi]
call putchar
add esp,4 ; reset esp (because __cdecl putchar)
inc edi
dec count
jnz showvar
}
return 0;
}
======
output
======
123
呃..
我看討論的層面,還是盡量留在 C 語言吧^^"
不然這樣恐怕會離題啦~~
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.70.137.117
※ 編輯: UNARYvvv 來自: 61.70.137.117 (08/10 21:52)
> -------------------------------------------------------------------------- <
作者: gaber (老。人渣爵士) 看板: C_and_CPP
標題: Re: [問題] 請問指標的問題
時間: Thu Aug 11 19:43:27 2005
※ 引述《UNARYvvv (有趣生活)》之銘言:
: ※ 引述《gaber (老。人渣爵士)》之銘言:
: : 因為 parser 會解析錯誤
: : 所以必須要透過另一個 pointer 來完成這個動作
: 還是沒有舉出實際的例子..麻煩請舉個一兩行實際 C code 好嗎?
: 先前我就是不清楚
: 你上次說 array
: 但後面又加註 "(variable-collection)" 是什麼意思
: 還是指一般的 array 嗎?
: 但這次你又沒寫 "array" 了
: 而且我先前說
: arr[var] => var[arr] => *(arr+var)
: 是要說明:順序不重要,因為最後是相加的
: 前提是 var 不是 array type
: (不然我就不用以 array 和一般 variable 來分了)
: 不好意思
: 一直沒搞懂你確切的意思~麻煩了
應該說
前提是該 variable 不屬於 variable-collection
所謂的 variable-collection
包括 array、struct、union
以下說明~~
ex.
int array_a[10];
int array_b[10];
int x;
/* initialize */
for(x=0;x<10;x++)
{
array_a[x]=x;
array_b[x]=x;
}
而你沒辦法用 array_a[ (array_b[5]) ]
來表示 array_a[6];
在 parser 判定程式碼時
array_b[5] 會被當成一個陣列在處理
所以要用一個指標或是一個不在任何結構體內的變數來傳值或傳址
ex.
int value;
value = array_b[5];
array_a[value];
/* 這樣不會有 warning 或是 error */
: : 而在組合語言
: : 所有的結構體都是透過 base、index、offset 來完成
: : varable 跟 variable-collection 都會被視為一個記憶體位址
: : [bs][bp]offset 或是 [si][di]offset 組譯通常是不會過
: : 必須利用 [bs/bp][si/di]offset 來完成這個動作
: : 二維以上的 array 在組語裡頭更會是個行數不少的 statement
: bs !!??
: 應該是 bx 吧?
: 不過如果是在現在常見的 IA-32 architecture 的話
: 在 protected mode 下
: 使用 indirect addressing mode
: 並沒有那個必須以 base register 搭配 index register 的限制
: 只要使用 general-purpose register 來搭配即可
: 剛才寫個小程式,測試時用 VC
: 因為使用到 VC 提供的 inline assembly 語法。
是的
是 bx 沒錯
感謝指正
你提供了一段程式碼
的確,在 win32 protect mode 下
這段程式碼編譯會過
而且也可以正確的執行
但是,也許你可以把你這個執行檔 dump 出來看
或是你要用反組譯的方法也行
應該是不會有 [esi][edi] 的情形出現
組合語言雖然低階
但是不代表你寫的就一定會是你所執行的
印象中
其中一個 index register 會被轉換成為一個 const offset
機械碼好像沒有可以直接 si + di 或是 bx + bp 的 opcode
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.165.138.36
> -------------------------------------------------------------------------- <
作者: UNARYvvv (有趣生活) 看板: C_and_CPP
標題: Re: [問題] 請問指標的問題
時間: Thu Aug 11 22:14:13 2005
※ 引述《gaber (老。人渣爵士)》之銘言:
: ※ 引述《UNARYvvv (有趣生活)》之銘言:
: : 還是沒有舉出實際的例子..麻煩請舉個一兩行實際 C code 好嗎?
: : 先前我就是不清楚
: : 你上次說 array
: : 但後面又加註 "(variable-collection)" 是什麼意思
: : 還是指一般的 array 嗎?
: : 但這次你又沒寫 "array" 了
: : 而且我先前說
: : arr[var] => var[arr] => *(arr+var)
: : 是要說明:順序不重要,因為最後是相加的
: : 前提是 var 不是 array type
: : (不然我就不用以 array 和一般 variable 來分了)
: : 不好意思
: : 一直沒搞懂你確切的意思~麻煩了
: 應該說
: 前提是該 variable 不屬於 variable-collection
: 所謂的 variable-collection
: 包括 array、struct、union
如果 var 又可能是 struct 或 union 的話
那 array[struct] 或 array[union] 本來語法就不對了
根本都還扯不到我說的「順序不重要」囉
不知你最早說
「... variable[array] == array[variable]
雖然在 C 語言的語法規則上並不成立 ...」
是只有說兩者分開個別語法正確,但是不相等?
還是兩邊個別的語法都不一定對,所以說 C 語法不成立?
就我的認知,我看了會覺得你的重點是要說「兩邊語法對,但結果不相等」
而我回到現在也只是在說,結果相等
而且我強調的只是
順序問題
當然就是 array[variable] 這東西至少要符合語法
才能進一步再說: variable[array] 也沒關係,因為順序不重要
而不管 variable 到底是不是 array/struct/union
因為在語法上那些東西作為 array 的 index 都已經不合法了
我認為前提並不需要列得這麼複雜,討論合法的就行了
若是要列舉更多作為 index 的不合法 variable 型態,那還有得提呢~
ex. function pointer,double,float ...
: 以下說明~~
: ex.
: int array_a[10];
: int array_b[10];
: int x;
: /* initialize */
: for(x=0;x<10;x++)
: {
: array_a[x]=x;
: array_b[x]=x;
: }
: 而你沒辦法用 array_a[ (array_b[5]) ]
: 來表示 array_a[6];
^
這邊你可能筆誤了,因為 (array_b[5]) 這個 expression 的值是 5
不過即使如此
上面說「沒辦法」真的沒辦法嗎?
以下小程式,用你上面列出的片段
只是之後加了一個 printf 印出相等判斷結果而已
#include <stdio.h>
int main(){
int array_a[10];
int array_b[10];
int x;
/* initialize */
for(x=0;x<10;x++)
{
array_a[x]=x;
array_b[x]=x;
}
printf("(array_a[ 5 ] == array_a[ (array_b[5]) ]) == %s",
(array_a[ 5 ] == array_a[ (array_b[5]) ])
? "true" : "false" );
return 0;
}
======
output
======
(array_a[ 5 ] == array_a[ (array_b[5]) ]) == true
實際上透過兩種寫法,會計算出相同位址
當然取出的值也就是相同的
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.70.137.117
※ 編輯: UNARYvvv 來自: 61.70.137.117 (08/11 22:15)