[问题]char 指标问题

楼主: amamoimi (佛仔)   2023-10-15 14:49:24
不好意思我程式新手又来扰民了@@
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.
为啥!?
在本版获益良多,希望各位这次也能不吝指教
谢谢大家!
作者: ssdoz2sk (眷恋着提拉米苏的风采~)   2023-10-15 15:01:00
因为以基础的资料型态来说,只有 char, int, float, double 与 signed, unsigned, 的各式组合,而其中 char 为1 byte。(char *) 是把整个资料当作一个长度为 n 的 byte array 来看。
作者: Lhmstu (lhmstu)   2023-10-15 15:06:00
char = 1 byte 一般来说是 8 bits,这边转成char*一次对1byte 进行互换(原本丢进函数后为已转为 void*),也就是说“接下来我一次要操作一个byte”这样的意思,所以后面++操作都是把pointer移动一个byte,移动几次则是根据你丢进去的size决定
作者: ssdoz2sk (眷恋着提拉米苏的风采~)   2023-10-15 15:08:00
补充一下,我习惯会重新定义 typedef unsigned charUINT8; 。会比较直观易懂,资料就是一个个 byte ,不会跟字串搞混。
楼主: amamoimi (佛仔)   2023-10-15 15:14:00
谢谢z大的详细解释!我懂为什么要用char了,但我还是不太懂为什么(char*)a是合法的写法...a明明就是一个整数变量,为什么可以创造一个char指标指向一个存著整数的内存位置啊@@
作者: Lhmstu (lhmstu)   2023-10-15 15:19:00
int 是4 bytes,你可以想像一个byte是一个箱子。而int*是指向排好的箱子的头,可以一次移动改写操作这四个箱子,如果你只想一次改动一个箱子( 1 byte),就可以转成char*,一次只对一个byte做处理,这就是强制性别转换。也是系统大了之后容易有bug的地方(x
作者: saxontai (黑暗,点缀孤零零的星)   2023-10-15 15:38:00
有stdint.h了,可以不用再自己typedef
作者: wulouise (在线上!=在电脑前)   2023-10-15 15:39:00
use case不合理,什么情况要swap不同type的资料?你要不要贴一下书名给大家看,有可能你的书太旧或写得不好最早c只有char代表8bits type,后来才有uint8_t
楼主: amamoimi (佛仔)   2023-10-15 15:56:00
书名是“第一次学C++就上手”我好像稍微懂了...所以其实可以assign一个地址(不管那个地址存放什么变量)给任何指标(指向任何型态)囉?(混乱...其实不管什么资料型态都是0101嘛)想再问一下 void*型态的参数是只要是地址都可以接收吗?
作者: Lhmstu (lhmstu)   2023-10-15 16:53:00
是的,void *是万用。如果要处理任何资料,都需要先把void*转成对应想要处理的型别的指标你可以尝试 unsigned int x = 258 然后强制转型成(unsigned char) 然后看结果,因为一个byte最多存256个值(258会进位用到下一个byte)
楼主: amamoimi (佛仔)   2023-10-15 17:12:00
了解了 谢谢大大!
作者: johnjohnlin (嗯?)   2023-10-15 19:47:00
建议还是使用std::swap
作者: wulouise (在线上!=在电脑前)   2023-10-15 20:44:00
byte by byte copy不一定比较快,没必要自己写swap
作者: Dracarys (MayShowGunMore)   2023-10-16 01:42:00
作者: leolarrel (真.粽子无双)   2023-10-16 12:55:00
你可能要先回去复习计概,重新理解什么是内存不然版友回答得再多妳还是有听却自以为懂
楼主: amamoimi (佛仔)   2023-10-16 14:10:00
谢谢 不过我我们同时修程式跟计概,所以我现在还在学习计概中@@
作者: descent (“雄辩是银,沉默是金”)   2023-10-16 14:45:00
推荐 C语言程序设计现代方法第2版, 很好的入门书
楼主: amamoimi (佛仔)   2023-10-16 14:48:00
另外想问一下https://onlinegdb.com/JH-pAJEJjb这时刚刚用来测试的程式我不小心把cout<<*b写成cout<<b 结果为什么output是一样的勒xd
作者: yvb   2023-10-16 15:27:00
计概教到 little endian 了吗?
作者: Dracarys (MayShowGunMore)   2023-10-16 15:29:00
因为你呼叫到吃const char*的operator<<了,就像你写std::cout << “M”;
作者: leolarrel (真.粽子无双)   2023-10-17 12:38:00
哪一家烂补习班不先教计概就教C语言阿? c/cpp语言又不像python 是高阶语言,中低阶语言很吃系统底层知识还有你上次问的递回,因为你没有根本上理解递回的核心义意,所以才会问出那样的问题.
作者: yvb   2023-10-17 15:41:00
可能是学校排课程的问题吧.
作者: closer76 (克楼瑟)   2023-10-17 17:12:00
我二十多年前在大学就是在计概课学C的啊!XDD
作者: Richun (解放左手的OO之力)   2023-10-17 17:12:00
如果从140那个IP来看,大一课程同时排计概跟程式设计常见不过先教C++这个做法真的颇神奇,怎么不是先教C或python?
作者: closer76 (克楼瑟)   2023-10-17 17:13:00
严格来说当年我们系上根本没有单独的C语言课,教授只有安排助教在晚上开C的补习课,真的需要的人就问助教。
作者: Richun (解放左手的OO之力)   2023-10-17 17:16:00
在学校的话TA时间就过去问爆,C++复杂度很高,陷阱很多。
作者: closer76 (克楼瑟)   2023-10-17 17:19:00
同意,C++真的复杂太多。学得越多越怕踩到陷阱 XD@amamoimi: 你要不要试着把 a=77 改成 a=21325 试试?这样 cout<<b 和 cout<<*b 结果就会不一样喔!然后你可以自己思考一下为什么会这样。
楼主: amamoimi (佛仔)   2023-10-17 17:35:00
有喔 我昨天花了一些时间测试了各种东西~感觉又复习了不少东西感谢各位大前辈愿意建议与指点本菜鸟!!
作者: DerLuna (阳月)   2023-10-18 21:03:00
这真的好难懂
作者: CoNsTaR ((const *))   2023-10-19 03:45:00
有 std::byte 可以用

Links booklink

Contact Us: admin [ a t ] ucptt.com