C_and_CPP 板


LINE

不好意思我程式新手又来扰民了@@ https://onlinegdb.com/Vm941gQ0_ 这是我在书上看到的程式码 功能是把变数byte by byte的交换 但是我看不太懂那个swap函数... 为什麽可以随便把参数冠上一个(char* )啊? 譬如a跟b明明就是int 把&a跟&b 前面加一个(char *)是什麽意思啊?又为什麽特别指定char呢? chatgpt 的解释是说(char*)x是在告诉compiler要把x跟y当作a sequence of bytes. 为啥!? 在本版获益良多,希望各位这次也能不吝指教 谢谢大家! ---- Sent from BePTT on my OPPO CPH1943 --
QR Code



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.200.241.52 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1697352566.A.A8C.html
1F:推 ssdoz2sk: 因为以基础的资料型态来说,只有 char, int, float, dou10/15 15:01
2F:→ ssdoz2sk: ble 与 signed, unsigned, 的各式组合,而其中 char 为10/15 15:01
3F:→ ssdoz2sk: 1 byte。(char *) 是把整个资料当作一个长度为 n 的 by10/15 15:01
4F:→ ssdoz2sk: te array 来看。10/15 15:01
5F:推 Lhmstu: char = 1 byte 一般来说是 8 bits,这边转成char*一次对110/15 15:06
6F:→ Lhmstu: byte 进行互换(原本丢进函数後为已转为 void*),也就是10/15 15:06
7F:→ Lhmstu: 说“接下来我一次要操作一个byte”这样的意思,所以後面+10/15 15:06
8F:→ Lhmstu: +操作都是把pointer移动一个byte,移动几次则是根据你丢10/15 15:06
9F:→ Lhmstu: 进去的size决定10/15 15:06
10F:推 ssdoz2sk: 补充一下,我习惯会重新定义 typedef unsigned char10/15 15:08
11F:→ ssdoz2sk: UINT8; 。会比较直观易懂,资料就是一个个 byte ,10/15 15:08
12F:→ ssdoz2sk: 不会跟字串搞混。10/15 15:08
13F:→ amamoimi: 谢谢z大的详细解释!我懂为什麽要用char了,但我还是不10/15 15:14
14F:→ amamoimi: 太懂为什麽(char*)a是合法的写法...a明明就是一个整数10/15 15:14
15F:→ amamoimi: 变数,为什麽可以创造一个char指标指向一个存着整数的10/15 15:14
16F:→ amamoimi: 记忆体位置啊@@10/15 15:14
17F:推 Lhmstu: int 是4 bytes,你可以想像一个byte是一个箱子。而int*是10/15 15:19
18F:→ Lhmstu: 指向排好的箱子的头,可以一次移动改写操作这四个箱子,10/15 15:19
19F:→ Lhmstu: 如果你只想一次改动一个箱子( 1 byte),就可以转成char*10/15 15:19
20F:→ Lhmstu: ,一次只对一个byte做处理,这就是强制性别转换。也是系10/15 15:19
21F:→ Lhmstu: 统大了之後容易有bug的地方(x10/15 15:19
22F:→ saxontai: 有stdint.h了,可以不用再自己typedef10/15 15:38
23F:推 wulouise: use case不合理,什麽情况要swap不同type的资料?你要不10/15 15:39
24F:→ wulouise: 要贴一下书名给大家看,有可能你的书太旧或写得不好10/15 15:39
25F:→ wulouise: 最早c只有char代表8bits type,後来才有uint8_t10/15 15:42
26F:→ amamoimi: 书名是「第一次学C++就上手」10/15 15:56
27F:→ amamoimi: 我好像稍微懂了...10/15 15:56
28F:→ amamoimi: 所以其实可以assign一个地址(不管那个地址存放什麽变10/15 15:56
29F:→ amamoimi: 数)给任何指标(指向任何型态)罗?(混乱...其实不管10/15 15:56
30F:→ amamoimi: 什麽资料型态都是0101嘛)10/15 15:56
※ 编辑: amamoimi (1.200.241.52 台湾), 10/15/2023 16:38:26 ※ 编辑: amamoimi (1.200.241.52 台湾), 10/15/2023 16:39:09
31F:→ amamoimi: 想再问一下 void*型态的参数是只要是地址都可以接收吗10/15 16:40
32F:→ amamoimi: ?10/15 16:40
33F:→ Lhmstu: 是的,void *是万用。如果要处理任何资料,都需要先把voi10/15 16:53
34F:→ Lhmstu: d*转成对应想要处理的型别的指标10/15 16:53
35F:推 Lhmstu: 你可以尝试 unsigned int x = 258 然後强制转型成(unsig10/15 17:04
36F:→ Lhmstu: ned char) 然後看结果,因为一个byte最多存256个值(258会10/15 17:04
37F:→ Lhmstu: 进位用到下一个byte)10/15 17:04
38F:→ amamoimi: 了解了 谢谢大大!10/15 17:12
39F:推 johnjohnlin: 建议还是使用std::swap10/15 19:47
40F:推 wulouise: byte by byte copy不一定比较快,没必要自己写swap10/15 20:44
41F:推 Dracarys: 因为char可以alias任何type10/16 01:42
42F:→ Dracarys: https://eel.is/c++draft/basic.lval#11.310/16 01:42
43F:→ Dracarys: https://bit.ly/3Fj63cZ10/16 01:46
44F:→ leolarrel: 你可能要先回去复习计概,重新理解什麽是记忆体10/16 12:55
45F:→ leolarrel: 不然版友回答得再多你还是有听却自以为懂10/16 12:56
46F:→ amamoimi: 谢谢 不过我我们同时修程式跟计概,所以我现在还在学习10/16 14:10
47F:→ amamoimi: 计概中@@10/16 14:10
※ 编辑: amamoimi (140.138.21.80 台湾), 10/16/2023 14:20:30
48F:推 descent: 推荐 C语言程序设计现代方法第2版, 很好的入门书10/16 14:45
谢谢大大推荐!
49F:→ amamoimi: 另外想问一下10/16 14:48
50F:→ amamoimi: https://onlinegdb.com/JH-pAJEJjb10/16 14:48
51F:→ amamoimi: 这时刚刚用来测试的程式10/16 14:48
52F:→ amamoimi: 我不小心把cout<<*b写成10/16 14:48
53F:→ amamoimi: cout<<b 结果为什麽output是一样的勒xd10/16 14:48
54F:推 yvb: 计概教到 little endian 了吗?10/16 15:27
55F:推 Dracarys: 因为你呼叫到吃const char*的operator<<了,就像你写st10/16 15:29
56F:→ Dracarys: d::cout << “M”;10/16 15:29
amamoimi: 谢谢 稍微测试一下明白了~(这边是书读的不够熟不好意思xd 10/16 18:02 ※ 编辑: amamoimi (1.200.241.52 台湾), 10/16/2023 18:29:31
57F:→ leolarrel: 哪一家烂补习班不先教计概就教C语言阿? c/cpp语言又不 10/17 12:38
58F:→ leolarrel: 像python 是高阶语言,中低阶语言很吃系统底层知识 10/17 12:39
59F:→ leolarrel: 还有你上次问的递回,因为你没有根本上理解递回的核心义 10/17 12:47
60F:→ leolarrel: 意,所以才会问出那样的问题. 10/17 12:48
61F:推 yvb: 可能是学校排课程的问题吧. 10/17 15:41
62F:推 closer76: 我二十多年前在大学就是在计概课学C的啊!XDD 10/17 17:12
63F:推 Richun: 如果从140那个IP来看,大一课程同时排计概跟程式设计常见 10/17 17:12
64F:→ Richun: 不过先教C++这个做法真的颇神奇,怎麽不是先教C或python? 10/17 17:13
65F:→ closer76: 严格来说当年我们系上根本没有单独的C语言课,教授只有 10/17 17:13
66F:→ closer76: 安排助教在晚上开C的补习课,真的需要的人就问助教。 10/17 17:14
67F:推 Richun: 在学校的话TA时间就过去问爆,C++复杂度很高,陷阱很多。 10/17 17:16
68F:推 closer76: 同意,C++真的复杂太多。学得越多越怕踩到陷阱 XD 10/17 17:19
69F:推 closer76: @amamoimi: 你要不要试着把 a=77 改成 a=21325 试试? 10/17 17:26
70F:→ closer76: 这样 cout<<b 和 cout<<*b 结果就会不一样喔! 10/17 17:26
71F:→ closer76: 然後你可以自己思考一下为什麽会这样。 10/17 17:26
72F:→ amamoimi: 有喔 我昨天花了一些时间测试了各种东西~感觉又复习了 10/17 17:35
73F:→ amamoimi: 不少东西 10/17 17:35
74F:→ amamoimi: 感谢各位大前辈愿意建议与指点本菜鸟!! 10/17 17:35
75F:推 DerLuna: 这真的好难懂 10/18 21:03
76F:推 CoNsTaR: 有 std::byte 可以用 10/19 03:45







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灯, 水草

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

TOP