推 stupid0319: int (*a)[6] 這樣的宣告寫10幾年C還沒見過.05/28 23:31
→ nh60211as: 看不太懂你對 char (*a)[6] 的理解是什麼意思,不過只05/29 00:08
→ nh60211as: 有a[0]會指到你期望的 str 開頭05/29 00:08
我的理解是:指向一個長度為6的char陣列的指標
※ 編輯: OnlyCourage (219.68.47.157 臺灣), 05/29/2023 00:18:21
推 wei115: 你說a = &str 那*a = str嘛 &str=str05/29 02:41
→ wei115: str[0] = *(str+0), 所以你不會顯示str[0]的值05/29 02:43
推 wei115: 陣列是陣列 指標是指標 別被C的a[n] = *(a+n)騙惹05/29 02:50
推 LPH66: 第一個 %p 印的是身為 char(*)[6] 的指標05/29 07:26
→ LPH66: 第二個 %p 印出的是 char[6] decay 成的 char* 指標05/29 07:27
→ LPH66: 你要的 'h' 是 **a05/29 07:27
畫了一張圖跟大大們說明一下。
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
推 wei115: 阿就str==&str阿 你把陣列當成一種指標惹 認為對陣列取址 05/29 13:01
→ wei115: 會有一個和陣列名不同的值 05/29 13:01
→ sarafciel: str跟&str雖然值一樣 型態卻不同 行為也不同05/29 13:29
推 wei115: 對,一個是[],一個是(*)[]05/29 13:39
好像有點頭緒了。
如果依照兩位大大的分享,
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
推 descent: printf("*a[0] address: %c\n", *a[0]);05/29 19:19
→ descent: printf("*a[0] address: %x\n", *a[0]); 05/29 19:19
→ descent: 你要的效果應該是這樣, 很有趣的問題, 想好久05/29 19:19
不好意思大大們回覆晚了!
沒錯XD 效果就是醬!
我也是看到題目想說來了解一下,又學到惹~
推 wei115: a的type是(*)[],*a才是[] 引用就加一個* 解引用就減一個*05/29 19:29
啊對!偶搞反惹~感謝大大糾正~
我覺得從型態來了解好像比較容易意會耶
推 LPH66: 首先你做了 a = &str, 所以理論上 *a "==" str05/29 20:39
→ LPH66: 而 str 是個 char[6] 所以 *a 也是個 char[6]05/29 20:39
→ LPH66: 而一個陣列型態在大多數狀況裡會 decay 成指向首元素的指標05/29 20:40
→ LPH66: 所以印 *a 印出的指標是這個東西05/29 20:41
查詢了一些資料了解大大的意思。
指標和陣列是不一樣的東西,但是陣列卻可以decay成指標, 之前一直以為是一樣的東西XD
題外話問個問題。
char a[]=“hello” -> 這是可以compile 的;
char* a=“hello” -> 也可以compile;
char (*a)[]=“hello” ->是會 compile fail 的。
1. 這也是因為陣列和指標是不一樣的關係,所以沒辦法在宣告的時候指向hello嗎?
2. char* 不也是將指標a指向hello空間的首元素嗎?
謝謝
我查資料也有看到這個連結。
精華:“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
推 LPH66: [] 裡面沒東西的型別宣告是未知長度, 除非有初始化指定長度 05/31 01:46
→ LPH66: char a[]="hello"; 右邊是 6 個元素, 所以這等於 char a[6] 05/31 01:47
→ LPH66: 至於 char(*a)[], 你是宣告一個指向未知長度陣列的指標 05/31 01:50
→ LPH66: 這跟字串實字是個指向字元指標是不一樣的05/31 01:51
大概了解大大的意思惹~感謝感謝~又學一課~
推 s0914714: 可以閱讀"Expert C Programming: Deep C Secrets"05/31 10:22
→ s0914714: 這本書有幾章在闡述array跟pointer的特質,值得一看05/31 10:23
推 wei115: 樓上好書,輕鬆有趣又實用05/31 11:24
推 Dracarys: Array和第一個元素「非」pointer-interconvertible結案05/31 15:13
我來看看跟大大們分享的文件學習一下
※ 編輯: OnlyCourage (219.68.47.157 臺灣), 06/02/2023 00:22:16
推 alan23273850: C語言博大精深啊~ 06/04 09:42
真的 每次都以為好像了解了但!沒有 哈哈
※ 編輯: OnlyCourage (101.10.108.86 臺灣), 06/05/2023 17:58:05
推 kiedveian: char *a = str; // 你要的效果應該是這樣 06/14 10:56