Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165200
  • 博文数量: 43
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 675
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-26 00:58
文章分类
文章存档

2014年(2)

2013年(41)

我的朋友

分类: C/C++

2013-03-11 19:44:37

我个人认为的h->length的作用
正常来说,一个IP地址,占四个字节。
但是这个结构体的最后一项h_addr_list是个二级指针
可以理解为h_addr_list[0]是第一个IP
h_addr_list[0][0]存的事第一个IP的第一个部分。
但这里有个问题,一个IP应该是4个字节,也就是4个char。
那么h_addr_list应该是char (*h_addr_list)[4],但现在只有一个h_addr_list怎么办?
我个人理解为,这里的h->length,存在的意义就是告诉我们一维的长度,通过这个,我们把它可以处理为二维数组了。
inet_ntoa(*((struct in_addr *)h->h_addr));
这种处理方法是根据指针强制转换后可以确定长度的原理。
还有其他的方法,比如
memcpy(&addr.sin_addr.s_addr,h->h_addr,h->h_length);

后面附一篇有关二维数组和二级指针的文章
Fun (int **p){}这里面的int **p //这里的p不是二维数组的指针,而是指向指针的指针,即二级指针。
正确的二维数组的指针应该是:Int a[2][2];Int (*p)[2];//定义时无论数组维数,只可忽略第一维
例如:int a[2][2]={0,1,2,3};
int **p=(int**)a;//强制将二维数组指针转为指向指针的指针
则此时p[0]=0;p[1]=1;p[2]=2;p[3]=3;
而p[0][0]=*(*(p+0)+0)=**p;
p[0][1]=*(*(p+0)+1);
对于p[0][0]:由于*p=0; ====> **p=*(0);引用地址为零的内存,必然是错误的。
对于p[0][1]=*(*p+1)====>*(4),引用了非法内存同样,
对于p[1][0]=*(1),p[1][1]=*(5),均引用了非法内存所以说,二位数组并不能简单的转换成指向指针的指针。 
二维数组其实只是一个指针,而二级指针是指向指针的指针,所以二者并不等价。如上例所示:int a[2][2];
 a是指向整个数组的首地址,并不是int **;所以不要指望向函数fun里面传实参 p=a;
阅读(1244) | 评论(0) | 转发(0) |
0

上一篇:关于子窗口的自绘

下一篇:dll和lib调用

给主人留下些什么吧!~~