指针数组、数组指针、memset填充问题

函数原型

memset(dist , val,size);

char test[64];

memset(test, 0,sizeof(test))、或者memset(test,'A',sizeof(test))没有任何问题,可以完成数组的正确填充。

同比:

int test[64];

memset(test,0,sizeof(test))应该能够将test 数组的每个元素填充为0,经验证,同样可以;

memset(test,1,sizeof(test)),理论上能够test数组的每个元素填充为1,事实是,test数组中出现的是:0x01010101(十六进制)。

为什么填充失败了?

反过头来看memset函数说明,memset是采用将val逐字节填充到dist中去。

当数组为char类型时,sizeof(char)==1,没有问题;

数组为int类型时,sizeof(int)==4,memset 会将数组元素的四个字节均填充为val,对应数值1,就是00000001000000010000000100000001,当转化成二进制时,就不可能是1了。

所以,使用memset填充数组时,需要牢记其是逐个字节填充。

发现memset的这个问题是源于对指针数组和数组指针的理解,两者在c++可谓是相当强大,易于混淆,偶尔捡起来回顾一下,甚好!

鉴于网上诸多关于指针数组、数组指针的用法介绍,我就不再献丑赘述,仅贴上例子,简单明了(其实,网上资源稂莠不齐,错误的讲解很多,关键还需要靠自己验证,才能明白个中道理)

int _tmain(int argc, _TCHAR* argv[])
{
//指针数组
int *p[N];
memset(p,NULL,sizeof(p));
for (int i=0;i<N;i++)
{
p[i]=new int ;
*p[i]=i;
}
for (int i=0;i<N;i++)
{
delete p[i];
p[i]=NULL;
}
int array[8][8];
//数组指针
int (*arrayPointer)[N];
arrayPointer=array;
for (int i=0;i<N;i++)
{
memset(arrayPointer,i,sizeof(int)*N);
arrayPointer++;
}
//int p1[100]等价如下:
int *p1=new int [100];
printf("0x%p\n",p1);
for (int i=0;i<100;i++)
{
p1[i]=i;
printf("%-4d \n",p1[i]);
}

delete p1 [];
return 0;
}

所说的数组和int 类型指针等价,是我自己个人的理解,数组会由编译器自动分配内存,int类型的指针可以由我们控制内存的分配。

对指针数组深入透彻明白以后,利用指针数组管理类的设计模式也就云开雾明了;

对数组指针深入透彻明白以后,利用数组指针操纵矩阵便再无违和之感了。

鄙人不才、献丑。

 c++,openGL,cg  learning on my way 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值