[問題] 指標(存取特定記憶體位址)

看板C_and_CPP作者 (rei)時間11年前 (2014/11/19 15:44), 編輯推噓4(4025)
留言29則, 6人參與, 最新討論串1/1
問題(Question): 小弟看到下面程式碼 int *ptr; ptr=(int *)0x5678; 查詢網路資料是說明上面程式碼表示 ptr此指標指向位址0x5678 不太明白為什上述程式碼能做到,指標不是就指向某變數的位址嗎(&var) 但0x5678也不是變數,謝謝大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.118.211.203 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1416383097.A.7C2.html

11/19 16:51, , 1F
簡單理解指標 就是一個存位址的變數
11/19 16:51, 1F

11/19 16:52, , 2F
不限定一定要是變數位址 也可以是記憶體的某個位址
11/19 16:52, 2F

11/19 16:53, , 3F
那如果把0x5678當位址就直接放進去ptr
11/19 16:53, 3F

11/19 16:53, , 4F
但直接指定位址很危險 因為很可能操作在不合法的位址
11/19 16:53, 4F

11/19 16:54, , 5F
為何還要轉型成指標型態 謝謝
11/19 16:54, 5F

11/19 16:54, , 6F
除非你很確定你做的事 或是寫比較低端的程式才會用
11/19 16:54, 6F

11/19 16:55, , 7F
轉型是轉成合法位址嗎??? > <
11/19 16:55, 7F

11/19 16:56, , 8F
告訴compiler 0x5678是一個int type的位址
11/19 16:56, 8F

11/19 16:57, , 9F
位址合不合法要看你的應用
11/19 16:57, 9F

11/19 16:59, , 10F
記憶體運作可以去看一些OS相關的書 裡面講得比我清楚
11/19 16:59, 10F

11/19 17:01, , 11F
可是(int *)0x5678 不是把0x5678轉成int型態的指標嗎???
11/19 17:01, 11F

11/19 17:01, , 12F
還是我理解錯誤 > <
11/19 17:01, 12F

11/19 17:05, , 13F
轉型是為了等號左邊,例如:double ptr;ptr=(double)0x5678;
11/19 17:05, 13F

11/19 17:09, , 14F
"ptr此指標指向位址0x5678" 這句話是錯的
11/19 17:09, 14F

11/19 17:14, , 15F
應該如何解釋 求教
11/19 17:14, 15F

11/19 17:35, , 16F
你可以print &ptr *ptr 看看 在想想
11/19 17:35, 16F

11/19 18:14, , 17F
回一樓:通常說指標p指向物件a,意指對p做dereference後等於a
11/19 18:14, 17F

11/19 18:14, , 18F
也就是*p等於a; 從原po程式碼來看並非如此囉
11/19 18:14, 18F

11/20 01:22, , 19F
指標實際上不就是指向某個位址
11/20 01:22, 19F

11/20 01:24, , 20F
無關dereference吧
11/20 01:24, 20F

11/20 09:29, , 21F
ptr指向位址0x5678, 而*ptr則是位址0x5678的值
11/20 09:29, 21F

11/20 10:23, , 22F
這樣解釋也可以啦,只不過就會變成"指標p指向物件a"和"指標p
11/20 10:23, 22F

11/20 10:24, , 23F
指向物件a的位址"這兩句話都對;我原意是想區分一下兩者差異
11/20 10:24, 23F

11/20 10:27, , 24F
我想區分原po的和int *addr=(int*)0x5678;int **ptr=&addr;
11/20 10:27, 24F

11/21 01:34, , 25F
指標轉型 基本上都是「怎麼解釋這個指標」
11/21 01:34, 25F

11/21 01:35, , 26F
這指標要拿多長來解釋?裡面的東西要怎麼翻譯?
11/21 01:35, 26F

11/21 01:36, , 27F
像是編譯器看到char*就知道 這指標要一路往後拿到第一
11/21 01:36, 27F

11/21 01:36, , 28F
個\0為止,看到int*就知道一共要拿4bytes做endian
11/21 01:36, 28F

11/21 12:59, , 29F
這是dsp的code?
11/21 12:59, 29F
文章代碼(AID): #1KR4fvV2 (C_and_CPP)