[問題] c pointer to array address 請教
看板C_and_CPP (C/C++)作者OnlyCourage (LaLaLand)時間1年前 (2023/05/28 23:18)推噓14(14推 0噓 18→)留言32則, 8人參與討論串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,
1年前
, 1F
05/28 23:31, 1F
→
05/29 00:08,
1年前
, 2F
05/29 00:08, 2F
→
05/29 00:08,
1年前
, 3F
05/29 00:08, 3F
→
05/29 00:08,
1年前
, 4F
05/29 00:08, 4F
我的理解是:指向一個長度為6的char陣列的指標
※ 編輯: OnlyCourage (219.68.47.157 臺灣), 05/29/2023 00:18:21
推
05/29 02:41,
1年前
, 5F
05/29 02:41, 5F
→
05/29 02:43,
1年前
, 6F
05/29 02:43, 6F
推
05/29 02:50,
1年前
, 7F
05/29 02:50, 7F
推
05/29 07:26,
1年前
, 8F
05/29 07:26, 8F
→
05/29 07:27,
1年前
, 9F
05/29 07:27, 9F
→
05/29 07:27,
1年前
, 10F
05/29 07:27, 10F
畫了一張圖跟大大們說明一下。
https://i.imgur.com/4ubpGJ9.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,
1年前
, 11F
05/29 13:01, 11F
→
05/29 13:01,
1年前
, 12F
05/29 13:01, 12F
→
05/29 13:29,
1年前
, 13F
05/29 13:29, 13F
推
05/29 13:39,
1年前
, 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,
1年前
, 15F
05/29 19:19, 15F
→
05/29 19:19,
1年前
, 16F
05/29 19:19, 16F
→
05/29 19:19,
1年前
, 17F
05/29 19:19, 17F
不好意思大大們回覆晚了!
沒錯XD 效果就是醬!
我也是看到題目想說來了解一下,又學到惹~
推
05/29 19:29,
1年前
, 18F
05/29 19:29, 18F
啊對!偶搞反惹~感謝大大糾正~
我覺得從型態來了解好像比較容易意會耶
推
05/29 20:39,
1年前
, 19F
05/29 20:39, 19F
→
05/29 20:39,
1年前
, 20F
05/29 20:39, 20F
→
05/29 20:40,
1年前
, 21F
05/29 20:40, 21F
→
05/29 20:41,
1年前
, 22F
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,
1年前
, 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,
1年前
, 24F
05/31 01:46, 24F
→
05/31 01:47,
1年前
, 25F
05/31 01:47, 25F
→
05/31 01:50,
1年前
, 26F
05/31 01:50, 26F
→
05/31 01:51,
1年前
, 27F
05/31 01:51, 27F
大概了解大大的意思惹~感謝感謝~又學一課~
推
05/31 10:22,
1年前
, 28F
05/31 10:22, 28F
→
05/31 10:23,
1年前
, 29F
05/31 10:23, 29F
推
05/31 11:24,
1年前
, 30F
05/31 11:24, 30F
推
05/31 15:13,
1年前
, 31F
05/31 15:13, 31F
→
05/31 15:13,
1年前
, 32F
05/31 15:13, 32F
我來看看跟大大們分享的文件學習一下
※ 編輯: OnlyCourage (219.68.47.157 臺灣), 06/02/2023 00:22:16
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章