[問題] c pointer to array address 請教

作者: OnlyCourage (Anan)   2023-05-28 23:18:56
開發平台(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):
作者: stupid0319 (徵女友)   2023-05-28 23:31:00
int (*a)[6] 這樣的宣告寫10幾年C還沒見過.
作者: nh60211as   2023-05-29 00:08:00
看不太懂你對 char (*a)[6] 的理解是什麼意思,不過只有a[0]會指到你期望的 str 開頭https://wandbox.org/permlink/0mNKaSWr6cTO5uHX
作者: wei115 (ㄎㄎ)   2023-05-29 02:41:00
你說a = &str 那*a = str嘛 &str=strstr[0] = *(str+0), 所以你不會顯示str[0]的值陣列是陣列 指標是指標 別被C的a[n] = *(a+n)騙惹
作者: LPH66 (-6.2598534e+18f)   2023-05-29 07:26:00
第一個 %p 印的是身為 char(*)[6] 的指標第二個 %p 印出的是 char[6] decay 成的 char* 指標你要的 'h' 是 **a
作者: wei115 (ㄎㄎ)   2023-05-29 13:01:00
阿就str==&str阿 你把陣列當成一種指標惹 認為對陣列取址會有一個和陣列名不同的值
作者: sarafciel (Cattuz)   2023-05-29 13:29:00
str跟&str雖然值一樣 型態卻不同 行為也不同
作者: wei115 (ㄎㄎ)   2023-05-29 13:39:00
對,一個是[],一個是(*)[]
作者: descent (「雄辯是銀,沉默是金」)   2023-05-29 19:19:00
printf("*a[0] address: %c\n", *a[0]);printf("*a[0] address: %x\n", *a[0]);你要的效果應該是這樣, 很有趣的問題, 想好久
作者: wei115 (ㄎㄎ)   2023-05-29 19:29:00
a的type是(*)[],*a才是[] 引用就加一個* 解引用就減一個*
作者: LPH66 (-6.2598534e+18f)   2023-05-29 20:39:00
首先你做了 a = &str, 所以理論上 *a "==" str而 str 是個 char[6] 所以 *a 也是個 char[6]而一個陣列型態在大多數狀況裡會 decay 成指向首元素的指標所以印 *a 印出的指標是這個東西
作者: s0914714 (YA)   2023-05-30 10:27:00
作者: LPH66 (-6.2598534e+18f)   2023-05-31 01:46:00
[] 裡面沒東西的型別宣告是未知長度, 除非有初始化指定長度char a[]="hello"; 右邊是 6 個元素, 所以這等於 char a[6]至於 char(*a)[], 你是宣告一個指向未知長度陣列的指標這跟字串實字是個指向字元指標是不一樣的
作者: s0914714 (YA)   2023-05-31 10:22:00
可以閱讀"Expert C Programming: Deep C Secrets"這本書有幾章在闡述array跟pointer的特質,值得一看
作者: wei115 (ㄎㄎ)   2023-05-31 11:24:00
樓上好書,輕鬆有趣又實用
作者: Dracarys (MayShowGunMore)   2023-05-31 15:13:00
Array和第一個元素「非」pointer-interconvertible結案https://wg21.link/basic.compound#4
作者: alan23273850   2023-06-04 09:42:00
C語言博大精深啊~
作者: kiedveian (極地之星光)   2023-06-14 10:56:00
char *a = str; // 你要的效果應該是這樣

Links booklink

Contact Us: admin [ a t ] ucptt.com