[原创] 纯C语法:指针的第二种玩法

辛昕   2015-6-22 12:40 楼主
前边发了一个帖子,也就lcoftp和另一个哥们回复的是对的(一直忘了给芯币,别火,我是真把这事情给忘了,几百个上千个芯币没法我自己给,我得找管理员,少不了你们,我回头会给的哈)



其实关于C指针,有好些玩法,但是刚学那会是真心体会不到的。

比如说前面我发的那个 利用指针(其实已经不能说是指针了,因为我的做法和lcoftp他们还有点不同,我是直接宏定义地址来操作的)

但是这也算是利用指针和地址来操作。



不说废话了,感觉我刚睡醒脑子不清醒,直接发下边这个不算题目的例子吧。



举个例子,现在我要在一片存储区里存储以下一系列变量

int anout;

float damn;

double fu;

.....



其实你知道都是我瞎编的,关键是,这些变量里包含各种各样的类型。



有 char int long long,乃至float double.

所以,如果我们要写一个 统一 的 读写接口,你会怎么写这个接口呢?



这是问题一,不过我相信,这个问题的答案是很显然的,你们一定会马上想到。



问题二:

最终到了读写存储区的时候,显然,我是不可能直接 写入 类似于 3.42,-0.3这样的浮点数进去的,读写存储区必然是以一串字符写进去的。

那么问题就是。

你会怎么实现 诸如  double  fu到 一串字符 写进去 和 读出来 这个过程中的 数据转换?




强者为尊,弱者,死无葬身之地

回复评论 (15)

2推荐 247153481 

引用: 辛昕 发表于 2015-6-22 19:19
是的,只不过,很多事情最后只是接口上简化了,内里还是一样的很多事情要处理。
转过去了还得转回来。

没错,只是对外提供一个接口
点赞  2015-6-22 19:37

2推荐 辛昕 

引用: 人民币的幻想 发表于 2015-6-22 16:11
问题一:通用类型指针和具体指针转换的问题。
问题二:借鉴memcpy函数解决这个问题。

没必要进行copy操作,copy就慢了。
像super那样,直接操作地址就行了。
强者为尊,弱者,死无葬身之地
点赞  2015-6-22 19:18

2推荐 辛昕 

引用: lcofjp 发表于 2015-6-22 12:56
问题1:写变量到存储器中,也就是把变量所占用的内存保存起来,读写接口大致需要两个参数,一个是变量的地 ...

写入
float a;
把(char *)&a当成你的 addr传入;

读出
(float *)&a = addr;
a就是读出来的内容;
强者为尊,弱者,死无葬身之地
点赞  2015-6-22 19:17

2推荐 辛昕 

引用: lcofjp 发表于 2015-6-22 12:56
问题1:写变量到存储器中,也就是把变量所占用的内存保存起来,读写接口大致需要两个参数,一个是变量的地 ...

还有一个参数,存储位置的地址。
话说,把void*,也就是存储的内容 命名成 地址,这倒是挺有意思的。
强者为尊,弱者,死无葬身之地
点赞  2015-6-22 19:14

2推荐 247153481 

我觉得void *指针是一个很好用的东西,忽略了各种类型的细节,统一的 指针占用为一个整形
点赞  2015-6-22 17:54

2推荐 人民币的幻想 

问题一:通用类型指针和具体指针转换的问题。
问题二:借鉴memcpy函数解决这个问题。
作为一个菜逼,干货并没有多少。唯一会的就是水,所以回帖水分大。望见谅!
点赞  2015-6-22 16:11

2推荐 feiting94 

推荐一本书

C与指针

C和指针.pdf (11.06 MB)
(下载次数: 55, 2015-6-22 15:20 上传)

点赞  2015-6-22 15:20

2推荐 feiting94 

引用: lcofjp 发表于 2015-6-22 12:56
问题1:写变量到存储器中,也就是把变量所占用的内存保存起来,读写接口大致需要两个参数,一个是变量的地 ...

应该还有一个变量指针的参数吧,可以是 void *buf ,这样可以兼顾不同类型的变量
点赞  2015-6-22 15:18

2推荐 lcofjp 

问题1:写变量到存储器中,也就是把变量所占用的内存保存起来,读写接口大致需要两个参数,一个是变量的地址,一个是变量所占的内存大小,例如:
int write_ee(void *addr, size_t cnt);
int read_ee(void *addr, size_t cnt);
问题2:按着变量地址从低到高写入,读的时候从低到高读出就行了。
点赞  2015-6-22 12:56

2推荐 辛昕 

PS:其实这些说白了都是一些小花样。
一旦说穿了啥意思都没有。

但是这些东西都意味着能否从 存储和内存的角度去理解C的一些语法要素。
掌握了这些才能说是懂得一些指针,而指针就是C的灵魂,我知道它很危险很容易出事,但是如果你不用它,那你用C干什么呢?
强者为尊,弱者,死无葬身之地
点赞  2015-6-22 12:43
分享铸就美好未来。。。
点赞  2015-6-22 12:50
我觉得指针还有一个很重要的就是函数指针
可以实现任务钩子函数,这在操作系统中很重要
点赞  2015-6-22 15:22
引用: lcofjp 发表于 2015-6-22 12:56 问题1:写变量到存储器中,也就是把变量所占用的内存保存起来,读写接口大致需要两个参数,一个是变量的地 ...
那个,写的地址是不是也该用指针作为变量添加进去啊? int write(void *buf_dst_addr, void *buf_src_addr, int dataLen); 本帖最后由 lonerzf 于 2015-6-22 15:31 编辑
这孩子,成熟的象征,理智的典范。
点赞  2015-6-22 15:29
引用: feiting94 发表于 2015-6-22 15:22
我觉得指针还有一个很重要的就是函数指针
可以实现任务钩子函数,这在操作系统中很重要

是的
强者为尊,弱者,死无葬身之地
点赞  2015-6-22 19:17
引用: 247153481 发表于 2015-6-22 17:54
我觉得void *指针是一个很好用的东西,忽略了各种类型的细节,统一的 指针占用为一个整形

是的,只不过,很多事情最后只是接口上简化了,内里还是一样的很多事情要处理。
转过去了还得转回来。
强者为尊,弱者,死无葬身之地
点赞  2015-6-22 19:19
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复