c++的*号是否有空格的区别以及char*转std::vector<float>解析

一、前言

      从一开始写c++,就发现大家的代码里,要么是char* b,要么是char *b,还有char * b这种写法,实在是一言难尽。起初还以为是有什么特别的技巧,后来才发现,呵呵哒。

二、正文

1、*带不带空格的区别

char* b
char *b
char * b
结论:这三种写法是一样的,都表示b是指针类型,指向一个char类型的字符串。建议第二种写法。


比如做函数传参:
char* a[] = {"hello world", "liitdar"};
char** b = a;

int main(int argc, char ** argv)
int main(int argc, char *argv[])

明显看出来写法不一样,这个跟个人编程习惯有关,建议保持一致。

      结论是三种写法含义一样,只是编程习惯上的差异!不止是char类型,其他类型指针也是同样的。

2、char*和char**

char a='1' 是一个字符;
char *b=12345or char b[]="12345" 是指针指向一个字符串。
char **c 也是指针,指向二维数组.。其同等表达为char *c[], char c[ ][ ]。

注意:c++中,数组名在 C 语言中做了特殊处理,数组名使用数组所占用的(连续)
内存区域的第一个字节的内存地址替代了。例如,数组占用的内存区域是 
0x7fff5da3f5500x7fff5da3f5a0,那么数组名 a 就会被替换成首地址
 0x7fff5da3f550;
所以 char *b 和 char b[]才可以互相转换。

3、关于指针运算

参考:[C/C++] 32位系统和64位系统中各个变量类型占的字节数
● 在 32 位系统中,一个指针占用 4 字节(32 位)内存空间;在 64 位系统中,一个指针占用 8 字节(64 位)内存空间;
● char类型1个字节,float类型是4字节
● 在32位系统和64位系统下只有指针类型和长整型字节数有所差别,其余全部相同’

4、char指针转std::vector 解析

auto len = xx.size()
conda char *data = xx.c_str();
std::vector<float> hyps{(float *)data, (float *)data + len / sizeof(float)};
(1)const char * 转换成 float *

      本来指针指向的是char类型,占用1个字节。现在是把char类型转换成float类型,占用4个字节。

(2)计算字符长度和指针偏移量

      获取char类型的lenlen/4,也就是本来16个字符,现在转换成float,就只剩4个字符了。

(3)初始化vector容器

参考:C++:vector的初始化定义和赋值方法总结
      这里采用的是地址初始化的方式,参数有两个,一个float* 类型的data,一个是地址偏移量的尾端地址

(float *)data 返回的是指向data的初始地址
len/sizeof(float) = len/4 ,假如len=16,那么16/4=4
vector的初始化形如: std::vector<float> xx{float* data,float*data + 4}
(4)std::vector 的() 和 {}
要注意“()”和“{}”这样的初始化情况,比如:
  std::vector<int> nVec(101);    // 包含10个元素,且值为1
  std::vector<int> nVec{101};    // 包含2个元素,值分别为10,1

      然而,一般在程序中,并不会知道vector的元素个数,故使用以上方式倒显得繁琐,所以可以使用push_back,它会负责将一个值当成vector对象的尾元素“压到(push)”vector对象的“尾端(back)”。

三、后记

      指针类型转换部分,让博主想起了gounsafe.Pointer,go官方一开始就屏蔽掉了指针运算,让大家专注于业务的同时,也缺失了对指针运算的理解。有好有坏吧,学就完了。

end

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铁柱同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值