C++的两个感悟

本文通过实践解析了memset函数的使用方法,特别关注了如何正确设置不同类型数据的大小,并讨论了强制类型转换的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

          今天,用到memset(void*,char c,size_t)。用的时候,突然发现不明白其对应的类型要求。就是void*是什么要求呢?我看了一下msdn,该函数功能是对每个byte进行赋值,所赋的值就是c,个数是size_t的值。
      那么,其它类型能不能调用这个函数呢?我是了一下。
int main()
{
int a[16*16];
memset(a ,0 ,16*16);
for( int i=0; i<16*16;++i)
  cout<<a[i]<<'/t';
 
return 0;
}
发现,只有一部分是0,另外一部分没有初始化。统计了一下,发现是64个是0.
后来,我猜它是以byte进行的,那么int有四个byte,那么size_t改一下试试。
int main()
{
int a[16*16];
memset(a ,0 ,16*16*4);
for( int i=0; i<16*16;++i)
  cout<<a[i]<<'/t';
 
return 0;
}
发现全是0了。
也就是说,该函数是以byte进行赋值,而要对其它类型T进行赋值,则size_t为个数n*sizeof(T)。
 
      另外,就是强制转换。前段时候学图像处理,经常用到这个。 现在想想,有些疑惑。
以下是我的理解,不知道对不对:
比如:BYTE*P=new BYTE[10];
          WORD *pw=(WORD*)p;
那么,pw所指向的空间大小仍然是p所指空间大小,即10bytes。也就是说pw所指的数据个数为5.
如果我的理解没有问题的话,那么,我觉得指针作为参数传递的时候,一定不要对其进行强制转换,否则的话数据个数发生改变,得到的很可能不是你想要的(比如:word变byte之后,就是两个书据了。也许你本想是将word数值赋值给byte类型)。
 
    突然发现,C真的是很不安全,因为是如此的自由。这个意思的话早就听过,但是在这之前没什么体会。但是,C真的很灵活!不过,功夫没到家之前最好不要用啦。。。。。。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值