C_and_CPP 板


LINE

开发平台(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): --
QR Code



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 219.68.47.157 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1685287138.A.E9D.html
1F:推 stupid0319: int (*a)[6] 这样的宣告写10几年C还没见过.05/28 23:31
2F:→ nh60211as: 看不太懂你对 char (*a)[6] 的理解是什麽意思,不过只05/29 00:08
3F:→ nh60211as: 有a[0]会指到你期望的 str 开头05/29 00:08
4F:→ nh60211as: https://wandbox.org/permlink/0mNKaSWr6cTO5uHX05/29 00:08
我的理解是:指向一个长度为6的char阵列的指标 ※ 编辑: OnlyCourage (219.68.47.157 台湾), 05/29/2023 00:18:21
5F:推 wei115: 你说a = &str 那*a = str嘛 &str=str05/29 02:41
6F:→ wei115: str[0] = *(str+0), 所以你不会显示str[0]的值05/29 02:43
7F:推 wei115: 阵列是阵列 指标是指标 别被C的a[n] = *(a+n)骗惹05/29 02:50
8F:推 LPH66: 第一个 %p 印的是身为 char(*)[6] 的指标05/29 07:26
9F:→ LPH66: 第二个 %p 印出的是 char[6] decay 成的 char* 指标05/29 07:27
10F:→ 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
11F:推 wei115: 阿就str==&str阿 你把阵列当成一种指标惹 认为对阵列取址 05/29 13:01
12F:→ wei115: 会有一个和阵列名不同的值 05/29 13:01
13F:→ sarafciel: str跟&str虽然值一样 型态却不同 行为也不同05/29 13:29
14F:推 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
15F:推 descent: printf("*a[0] address: %c\n", *a[0]);05/29 19:19
16F:→ descent: printf("*a[0] address: %x\n", *a[0]); 05/29 19:19
17F:→ descent: 你要的效果应该是这样, 很有趣的问题, 想好久05/29 19:19
不好意思大大们回覆晚了! 没错XD 效果就是酱! 我也是看到题目想说来了解一下,又学到惹~
18F:推 wei115: a的type是(*)[],*a才是[] 引用就加一个* 解引用就减一个*05/29 19:29
啊对!偶搞反惹~感谢大大纠正~ 我觉得从型态来了解好像比较容易意会耶
19F:推 LPH66: 首先你做了 a = &str, 所以理论上 *a "==" str05/29 20:39
20F:→ LPH66: 而 str 是个 char[6] 所以 *a 也是个 char[6]05/29 20:39
21F:→ LPH66: 而一个阵列型态在大多数状况里会 decay 成指向首元素的指标05/29 20:40
22F:→ 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空间的首元素吗? 谢谢
23F:推 s0914714: https://reurl.cc/p6m1x405/30 10:27
我查资料也有看到这个连结。 精华:“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
24F:推 LPH66: [] 里面没东西的型别宣告是未知长度, 除非有初始化指定长度 05/31 01:46
25F:→ LPH66: char a[]="hello"; 右边是 6 个元素, 所以这等於 char a[6] 05/31 01:47
26F:→ LPH66: 至於 char(*a)[], 你是宣告一个指向未知长度阵列的指标 05/31 01:50
27F:→ LPH66: 这跟字串实字是个指向字元指标是不一样的05/31 01:51
大概了解大大的意思惹~感谢感谢~又学一课~
28F:推 s0914714: 可以阅读"Expert C Programming: Deep C Secrets"05/31 10:22
29F:→ s0914714: 这本书有几章在阐述array跟pointer的特质,值得一看05/31 10:23
30F:推 wei115: 楼上好书,轻松有趣又实用05/31 11:24
31F:推 Dracarys: Array和第一个元素「非」pointer-interconvertible结案05/31 15:13
32F:→ Dracarys: https://wg21.link/basic.compound#405/31 15:13
我来看看跟大大们分享的文件学习一下 ※ 编辑: OnlyCourage (219.68.47.157 台湾), 06/02/2023 00:22:16
33F:推 alan23273850: C语言博大精深啊~ 06/04 09:42
真的 每次都以为好像了解了但!没有 哈哈 ※ 编辑: OnlyCourage (101.10.108.86 台湾), 06/05/2023 17:58:05
34F:推 kiedveian: char *a = str; // 你要的效果应该是这样 06/14 10:56







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP