作者amamoimi (佛仔)
看板C_and_CPP
标题[问题]char 指标问题
时间Sun Oct 15 14:49:24 2023
不好意思我程式新手又来扰民了@@
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
--
※ 发信站: 批踢踢实业坊(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
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
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