[問題] c pointer to array address 請教

看板C_and_CPP作者 (LaLaLand)時間11月前 (2023/05/28 23:18), 10月前編輯推噓14(14018)
留言32則, 8人參與, 11月前最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) online c compiler 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) gcc 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) NA 問題(Question): 想請教為甚麼 a 與 *a 的 %p address 會是一樣的呢? 我的理解是 int (*a)[6] 是指向一個長度為 6 的 int 型態的指標,所以 a 應該會存放 &str 位置 printf a 會出現 &str 這部分可以理解。 但 printf *a 應該是對 a 取值再用%p顯示,所以會得到 0x68 也就是 'h'。 還請各位大神指導,感謝! 雖然這種方式好像很少使用XD 餵入的資料(Input): NA 預期的正確結果(Expected Output): run: a address: 0x7ffdd628c6d2 *a address: 0x7ffdd628c6d2 expect: a: 0x7ffdd628c6d2 *a: 0x68 錯誤結果(Wrong Output): NA 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) char str[6] = "hello"; char (*a)[6] = &str; printf("a address: %p\n", a); printf("*a address: %p\n", *a); 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 219.68.47.157 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1685287138.A.E9D.html

05/28 23:31, 11月前 , 1F
int (*a)[6] 這樣的宣告寫10幾年C還沒見過.
05/28 23:31, 1F

05/29 00:08, 11月前 , 2F
看不太懂你對 char (*a)[6] 的理解是什麼意思,不過只
05/29 00:08, 2F

05/29 00:08, 11月前 , 3F
有a[0]會指到你期望的 str 開頭
05/29 00:08, 3F

05/29 00:08, 11月前 , 4F
我的理解是:指向一個長度為6的char陣列的指標 ※ 編輯: OnlyCourage (219.68.47.157 臺灣), 05/29/2023 00:18:21

05/29 02:41, 11月前 , 5F
你說a = &str 那*a = str嘛 &str=str
05/29 02:41, 5F

05/29 02:43, 11月前 , 6F
str[0] = *(str+0), 所以你不會顯示str[0]的值
05/29 02:43, 6F

05/29 02:50, 11月前 , 7F
陣列是陣列 指標是指標 別被C的a[n] = *(a+n)騙惹
05/29 02:50, 7F

05/29 07:26, 11月前 , 8F
第一個 %p 印的是身為 char(*)[6] 的指標
05/29 07:26, 8F

05/29 07:27, 11月前 , 9F
第二個 %p 印出的是 char[6] decay 成的 char* 指標
05/29 07:27, 9F

05/29 07:27, 11月前 , 10F
你要的 'h' 是 **a
05/29 07:27, 10F
畫了一張圖跟大大們說明一下。 https://i.imgur.com/4ubpGJ9.jpg
https://i.imgur.com/AAP8FIZ.jpg
&a: 表示指標的位置。 a:表示指標指向str陣列的位置,所以裡面存的是&str 。 *a:對a裡面的位置(0x7ffe0b33eb62)去取值,所以自己的預期應該是0x68才對。但如果要 取到0x68的話,就要用**a。 有疑問的是為什麼*a是對0x7ffe0b33eb62取值,結果印出來的結果依然是0x7ffe0b33eb62呢 ? ※ 編輯: OnlyCourage (49.216.184.248 臺灣), 05/29/2023 11:46:06

05/29 13:01, 11月前 , 11F
阿就str==&str阿 你把陣列當成一種指標惹 認為對陣列取址
05/29 13:01, 11F

05/29 13:01, 11月前 , 12F
會有一個和陣列名不同的值
05/29 13:01, 12F

05/29 13:29, 11月前 , 13F
str跟&str雖然值一樣 型態卻不同 行為也不同
05/29 13:29, 13F

05/29 13:39, 11月前 , 14F
對,一個是[],一個是(*)[]
05/29 13:39, 14F
好像有點頭緒了。 如果依照兩位大大的分享, str是陣列,型別為[]。 a是指標,型別為(*)。 *a是陣列,型別為(*)[]。 因為a雖然是指向整個陣列str(&str)的指標,但是*a卻是個陣列,所以*a會印出陣列str的 位置(&str)。 不知道這樣的觀念是否正確? 還望大大們指點迷津感謝 ※ 編輯: OnlyCourage (49.216.184.248 臺灣), 05/29/2023 14:49:32 ※ 編輯: OnlyCourage (49.216.184.248 臺灣), 05/29/2023 15:01:44

05/29 19:19, 11月前 , 15F
printf("*a[0] address: %c\n", *a[0]);
05/29 19:19, 15F

05/29 19:19, 11月前 , 16F
printf("*a[0] address: %x\n", *a[0]);
05/29 19:19, 16F

05/29 19:19, 11月前 , 17F
你要的效果應該是這樣, 很有趣的問題, 想好久
05/29 19:19, 17F
不好意思大大們回覆晚了! 沒錯XD 效果就是醬! 我也是看到題目想說來了解一下,又學到惹~

05/29 19:29, 11月前 , 18F
a的type是(*)[],*a才是[] 引用就加一個* 解引用就減一個*
05/29 19:29, 18F
啊對!偶搞反惹~感謝大大糾正~ 我覺得從型態來了解好像比較容易意會耶

05/29 20:39, 11月前 , 19F
首先你做了 a = &str, 所以理論上 *a "==" str
05/29 20:39, 19F

05/29 20:39, 11月前 , 20F
而 str 是個 char[6] 所以 *a 也是個 char[6]
05/29 20:39, 20F

05/29 20:40, 11月前 , 21F
而一個陣列型態在大多數狀況裡會 decay 成指向首元素的指標
05/29 20:40, 21F

05/29 20:41, 11月前 , 22F
所以印 *a 印出的指標是這個東西
05/29 20:41, 22F
查詢了一些資料了解大大的意思。 指標和陣列是不一樣的東西,但是陣列卻可以decay成指標, 之前一直以為是一樣的東西XD 題外話問個問題。 char a[]=“hello” -> 這是可以compile 的; char* a=“hello” -> 也可以compile; char (*a)[]=“hello” ->是會 compile fail 的。 1. 這也是因為陣列和指標是不一樣的關係,所以沒辦法在宣告的時候指向hello嗎? 2. char* 不也是將指標a指向hello空間的首元素嗎? 謝謝

05/30 10:27, 11月前 , 23F
05/30 10:27, 23F
我查資料也有看到這個連結。 精華:“array” is a “pointer to the first element of array” but “&array” is a “pointer to whole array of 5 int”. Since “array” is pointer to int, addit ion of 1 resulted in an address with increment of 4 (assuming int size in your m achine is 4 bytes). Since “&array” is pointer to array of 5 ints, addition of 1 resulted in an address with increment of 4 x 5 = 20 = 0x14. ※ 編輯: OnlyCourage (219.68.47.157 臺灣), 05/30/2023 23:50:58 ※ 編輯: OnlyCourage (219.68.47.157 臺灣), 05/30/2023 23:53:22

05/31 01:46, 11月前 , 24F
[] 裡面沒東西的型別宣告是未知長度, 除非有初始化指定長度
05/31 01:46, 24F

05/31 01:47, 11月前 , 25F
char a[]="hello"; 右邊是 6 個元素, 所以這等於 char a[6]
05/31 01:47, 25F

05/31 01:50, 11月前 , 26F
至於 char(*a)[], 你是宣告一個指向未知長度陣列的指標
05/31 01:50, 26F

05/31 01:51, 11月前 , 27F
這跟字串實字是個指向字元指標是不一樣的
05/31 01:51, 27F
大概了解大大的意思惹~感謝感謝~又學一課~

05/31 10:22, 11月前 , 28F
可以閱讀"Expert C Programming: Deep C Secrets"
05/31 10:22, 28F

05/31 10:23, 11月前 , 29F
這本書有幾章在闡述array跟pointer的特質,值得一看
05/31 10:23, 29F

05/31 11:24, 11月前 , 30F
樓上好書,輕鬆有趣又實用
05/31 11:24, 30F

05/31 15:13, 11月前 , 31F
Array和第一個元素「非」pointer-interconvertible結案
05/31 15:13, 31F

05/31 15:13, 11月前 , 32F
我來看看跟大大們分享的文件學習一下 ※ 編輯: OnlyCourage (219.68.47.157 臺灣), 06/02/2023 00:22:16
文章代碼(AID): #1aSt3YwT (C_and_CPP)