C++指针强制类型转换


鉴于指针之间这种灵活的强制类型转换的需求和出于简化代码的考虑,ANSI C 引 入了空指针即 void*。void 指针又名万能指针,在现在的很多程序中,当参数不 确定时就用万能指针代替,这一类的指针在线程\进程函数里特别常见。 ANSI C 规定,void 指针可以复制给其他任意类型的指针,其他任意类型的指针也 可以复制给 void 指针,他们之间复制不需要强制类型转换。当然任何地址也可 以复制给 void 型指针。我们在《网络编程》中经常会看到 accept(socket, (struct sockaddr *)&saddr_c, &lenth)之类的语句在&saddr_c 之前需要增加代码(struct sockaddr *)是因为当此函数被设计的时候 ANSI C 还没有提出 void*的概念。所有 的地址统一用 struct sockaddr 类型标识,该函数的第二个参数也是指向 struct sockaddr 类型的指针,此处是强制类型转换。 当然,在某些编译器中不同类型的指针也可以进行直接赋值,但一般情况下会给 出类型不匹配的警告。要求程序员显示的给出指针强制类型转换可以提醒程序员 小心使用指针,对于明确程序目的具有一定的好处。 1、指针类型强制转换: int m; int *pm = &m; char *cp = (char *)&m; pm 指向一个整型,cp 指向整型数的第一个字节 2、结构体之间的强制转换 struct str1 a; struct str2 b; a=(struct str1) b; //this is wrong a=*((struct str1*)&b); //this is correct 3、关于一个程序的解释 int main(void) { int a[4] = {1, 2, 3, 4}; int *ptr1=(int *)(&a+1); int *ptr2=(int *)((int)a+1); int *c = *(a + 1); printf("%x, %x,%x\n", ptr1[-1], *ptr2,*c); return 0; } 输出分别为 4 和 2000000,2 式子&a+1 表示的是指针加法运算,而不是普通的数值加法运算 vs2008 下,其中 a = 0x001bfc18 (&a + 1) = 0x001bfc28 而 a+1 = 0x001bfc1c &a + 1 的值取决于 a 的类型如果 a 申明 int a; 则&a + 1 = 0xFFFF5704 = a + 1 如果 int a(ArryLen); 则&a + 1 = 0xFFFF5700 + 4 * ArryLen <> a + 1 a 表示数组的起始地址,(int ) a 表示将 a 的地址转化为一个整形数,(int)a + 1 表示普通的数值加法运算,(int *)((int)a + 1)表示把(int )a + 1 转化为整 型指针的地址。该地址指向数组 a(0)的第一个字节(从 0 计数),因为是 int 型的 所以需要四个字节的解释,所以结果是 a(0)的后三个字节和 a(1)的第 一个字节组成的值,该值受大小端的影响。 *(a + 1) 此时的 a 已经是一个常指针了,这个表达式计算出 a 所指向元素后面 的第 2 个元素的地址,然后对它解引用得到相应的值。这个表达式等价于 int last = a[1]
还剩1页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 2 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

yun2013

贡献于2013-07-06

下载需要 2 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf