今天,用到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真的很灵活!不过,功夫没到家之前最好不要用啦。。。。。。