Re: [問題] 簡單指標釐清

看板C_and_CPP (C/C++)作者 (mgupo)時間15年前 (2010/10/10 19:52), 編輯推噓5(5031)
留言36則, 4人參與, 最新討論串3/3 (看更多)
First of all, you should use %p to print a pointer. Second, yes, you're printing a, which is a "pointer" and it has been set to 3. It does not mean you set the integer to 3; rather, you set the "pointer" to 3. 不好意思 請問我可以理解成有一個記憶體位址為0x3 而我把int *a = 3;是在直接對a指派他要指的位址一樣 就像是在做int *a; a = 2200FF;之類的事情嗎? 那麼如果是這樣的話 建議的寫法,是int b=3; int *a; a = &b; 會比較嚴謹嗎?? 謝謝 It seems to be correct is simply because you're using int. Try other incompatible data type like double or string, your compiler will not allow you to do that any more. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.195.33.84

10/10 19:56, , 1F
沒什麼嚴不嚴謹,重點是你想要做什麼呢?
10/10 19:56, 1F

10/10 19:59, , 2F
就像我在前一篇的推文中打的, 如果你知道自己在做什麼
10/10 19:59, 2F

10/10 19:59, , 3F
其實指標就是無號整數, 硬是要這樣玩也是可以的, 只是
10/10 19:59, 3F

10/10 19:59, , 4F
不好看
10/10 19:59, 4F

10/10 20:04, , 5F
有一個八卦是,通常指標的寬度是跟長整數相同,雖然說整數
10/10 20:04, 5F

10/10 20:04, , 6F
也是通。另外有用 autoconf 或 CMake 的話,寬度可以在
10/10 20:04, 6F

10/10 20:05, , 7F
一開始就偵測出來,然後定義出一個對應指標的整數型別。
10/10 20:05, 7F
夭壽~謝謝大家 我突然整個開竅了 我懂了!!我想了一下我到底需要的是什麼 結果發現我把問題複雜化了 不過我現在只是想知道 int *a = 3;這樣子宣告的compiler詳細動作 以便更了解 謝謝各位的指點 ※ 編輯: mgupo 來自: 123.195.33.84 (10/10 20:12)

10/10 20:11, , 8F
我記得 sizeof(pointer) 會等於 sizeof(long)
10/10 20:11, 8F

10/10 20:11, , 9F
這個等於是必然的嗎?
10/10 20:11, 9F

10/10 20:12, , 10F
嗯嗯, 這些都要看平台來改...
10/10 20:12, 10F

10/10 20:13, , 11F
反組譯一下你就知道他在做什麼了...
10/10 20:13, 11F

10/10 20:14, , 12F
其實就跟你說的 int *a; a = 2200FF; 做的事情差不多
10/10 20:14, 12F

10/10 20:21, , 13F
那個等於不是必然的,只是一個慣例。
10/10 20:21, 13F

10/10 20:23, , 14F
了解 感謝樓上 XD 解開了我一個誤會
10/10 20:23, 14F

10/10 20:26, , 15F
原來如此阿...我也誤會蠻深的0.0 乾蝦
10/10 20:26, 15F

10/10 20:29, , 16F
其實 <stdint.h> 裡有 intptr_t 跟 uintptr_t 可以用,
10/10 20:29, 16F

10/10 20:30, , 17F
但是我記得這好像只是 C99 允許實作提供,
10/10 20:30, 17F

10/10 20:30, , 18F
有沒有硬性要求必須有我忘了,因為我餓了,懶得去翻 XD
10/10 20:30, 18F

10/10 20:33, , 19F
不過看起來大家的玩法都一樣:http://tinyurl.com/25szo22
10/10 20:33, 19F

10/10 20:33, , 20F
先 CMake 欲或 autoconf 去檢查有沒有,再把結果寫入
10/10 20:33, 20F

10/10 20:34, , 21F
HAVE_INTPTR_T 和 HAVE_UINTPTR_T,
10/10 20:34, 21F

10/10 20:34, , 22F
沒有的話就直接把 long 和 unsigned long typedef 過去。
10/10 20:34, 22F

10/10 20:42, , 23F
嗯嗯 我以為C++會有typedef之類的, 剛找了一下沒收穫
10/10 20:42, 23F

10/10 20:43, , 24F
又有東西可以學了 \^o^/
10/10 20:43, 24F

10/10 23:37, , 25F
這有一個故事,以前有人想把 pointer 當成 hash table 的
10/10 23:37, 25F

10/10 23:38, , 26F
key,結果他 key type 用 int,結果上 64-bit 編完跑下去
10/10 23:38, 26F

10/10 23:38, , 27F
就炸了。故事結束。
10/10 23:38, 27F

10/10 23:53, , 28F
嗯嗯, 如果用 size_t 應該就安全吧?
10/10 23:53, 28F

10/10 23:56, , 29F
size_t跟pointer size之間沒任何保證吧
10/10 23:56, 29F

10/11 00:00, , 30F
看t大的推文 應該要用intptr_t最安全
10/11 00:00, 30F

10/11 00:06, , 31F
我剛打太快, 原本是要打 ptrdiff_t 不是size_t 0.0
10/11 00:06, 31F

10/11 00:12, , 32F
找到他的值的限制了! 還是只能用intptr_t ...
10/11 00:12, 32F

10/11 00:18, , 33F
7.18.1.4 最後一行寫到 : These types are optional.
10/11 00:18, 33F

10/11 00:21, , 34F
不意外,所以 autoconf 和 CMake 的 user 都喜歡先偵測再
10/11 00:21, 34F

10/11 00:21, , 35F
決定要不要 typedef 成 long。
10/11 00:21, 35F

10/11 00:22, , 36F
之前在把 binutils 和 libiberty 做 CMake 化時有看過。
10/11 00:22, 36F
文章代碼(AID): #1CiQZopj (C_and_CPP)
文章代碼(AID): #1CiQZopj (C_and_CPP)