4.2.2 显式指针转换
将一个指针转换为另一个指针类型,必须使用一个显示转换,一些情景下,编译器会提供隐式的转换,这些描述在本章后面的部分,指针也可以显式地转换为整型,反之亦然。
4.2.2.1 对象指针
你可以显示地转换一个对象指针为另一个对象指针类型。在程序中,你必须确保这种转换有意义。例如:
float f_var = 1.5F;
long *l_ptr = (long *)&f_var; // Initialize a pointer to long with
// the address of f_var.
double *d_ptr = (double *)l_ptr; // Initialize a pointer to double with
// the same address.
// On a system where sizeof(float) equals sizeof(long):
printf( "The %d bytes that represent %f, in hexadecimal: 0x%lX/n",
sizeof(f_var), f_var, *l_ptr );
// Using a converted pointer in an assignment can cause trouble:
/* *d_ptr = 2.5; */ // Don't try this! f_var's location doesn't
// have space for a double value!
*(float *)d_ptr = 2.5; // OK: stores a float value in that location.
如果转换后的对象指针没有对齐要求,使用指针的结果将没有定义,在另一个场景中,将指针的值再次转换为它原来的类型,会产生一个与原指针等价的指针。
如果将对象指针转换为字符类型(char, signed char 或 unsigned char), 结果将为此对象首字节的指针,首字节被认为是二进制的低地址,不管系统的字节顺序,下例使用此特性打印一个结构体变量的十六进制值。
#include <stdio.h>
struct Data {
short id;
double val;
};
struct Data myData = { 0x123, 77.7 }; // Initialize a structure.
unsigned char *cp = (unsigned char *)&myData; // Pointer to the first
// byte of the structure.
printf( "%p: ", cp ); // Print the starting
// address.
for ( int i = 0; i < sizeof(myData); ++i ) // Print each byte of the
printf( "%02X ", *(cp + i) ); // structure, in hexadecimal.
putchar( '/n' );
本例输出如下的结果:
0xbffffd70: 23 01 00 00 00 00 00 00 CD CC CC CC CC 6C 53 40
结果的前两个字节为23 01,表示此代码是在一个小端的系统上执行的,在myData结构中字节最低位地址为shoart类型的变量id。
4.2.2.2 函数指针
函数通常具有返回值类型,也包含参数类型,你可以将一个函数指针的类型转换为另一个函数指针类型,在下例中,typedef语句为一个具有double类型参数和double类型返回值的函数定义了一个类型名。
#include <math.h> // Declares sqrt( ) and pow( ).
typedef double (func_t)(double); // Define a type named func_t.
func_t *pFunc = sqrt; // A pointer to func_t, initialized with
// the address of sqrt( ).
double y = pFunc( 2.0 ); // A correct function call by pointer.
printf( "The square root of 2 is %f./n", y );
pFunc = (func_t *)pow; // Change the pointer's value to the
// address of pow( ).
/* y = pFunc( 2.0 ); */ // Don't try this: pow( ) takes two
// arguments.
在本例中,函数指针pFunc被赋值为不同类型函数的地址,然而,如果程序使用指针调用函数时,如果与原来的指针类型不匹配,程序的结果将不可预计。
分享到:
相关推荐
### C语言核心技术(英文文字版) #### 书籍概述 《C语言核心技术》是一本由 Tony Crawford 和 Peter Rinz 合著的经典技术书籍,由著名的 O'Reilly 出版社出版。该书首次发布于2005年12月,全书共计618页,ISBN号...
### C语言核心技术(C in a Nutshell) #### 知识点概述 《C语言核心技术》是一本由C语言专家Peter Prinz与Tony Crawford合作撰写的权威性书籍,它旨在为C语言程序员提供全面且深入的核心知识和技术指导。本书不仅...
《C语言技术手册》是一本全面且深入探讨C语言编程的资源,旨在帮助开发者和学习者迅速查询和理解C语言的各种函数及语法特性。CHM(Compiled Help Manual)格式是微软开发的帮助文档格式,通常包含丰富的索引、搜索...
### C语言核心技术(C: In a Nutshell) #### 核心知识点概览 《C语言核心技术》这本书由Tony Crawford和Peter Prinz等作者编写,由O'Reilly出版社于2005年12月出版。全书共有618页,涵盖了C语言的所有核心概念和...
### C语言核心技术——《C in a Nutshell》 #### 一、书籍简介 《C in a Nutshell》是由Tony Rawford和Peter Rinz共同编写的关于C语言的权威指南,出版社为O'Reilly,出版日期为2005年12月,ISBN编号为0-596-00697...
《C语言核心技术》不仅适合C语言初学者快速入门,也适合有经验的程序员作为日常工作的参考手册。该书内容丰富,结构清晰,通过大量实例加深读者对C语言的理解和掌握,是C语言学习者和专业程序员的必备书籍之一。 ...
《C语言核心技术》不仅适合初学者作为C语言学习的快速入门指南,也适合有经验的程序员作为日常工作的实用参考手册。书中深入浅出地讲解了C语言的各个方面,辅以丰富的示例代码,使读者能够在实践中加深理解和记忆。...
### C核心技术手册知识点总结 #### 一、C语言的基础语法 **1.1 C的特征** C语言是一种过程式编程语言,由Dennis Ritchie于1970年代初在贝尔实验室开发,最初是为了实现UNIX操作系统及其应用程序能够尽可能地与...
根据提供的信息,《LINUX内核技术手册2.pdf》是一本专注于Linux内核配置、构建及安装的专业技术书籍。以下是对该书所涉及的关键知识点的详细总结: ### 一、书籍基本信息 - **书名**: Linux内核技术手册 - **作者*...
《云打印C-Lodop技术手册》是一本详细介绍如何利用C-Lodop进行云端打印操作的技术文档。C-Lodop,全称为Cloud Lodop,是一款高效便捷的云打印解决方案,尤其适用于小票、箱贴、财务单等各类文档的远程打印需求。其...
02H3 C VEPC3200核心网故障处理手册pdf 03H3CBBU3100系列基带处理单元故障处理手册,p 04H3 C VEPC3200产品开局自检手册pdf 05H3 C VMEGW3200技术白皮书pdf 06移动通信技术概述pdf 07H3CEPC3108核心网特性手册(E2123)...
综上所述,《C语言核心技术》这本书不仅是一本C语言的入门指南,还是一本详尽的参考手册。无论是初学者还是有经验的开发者,都能从中受益匪浅。通过系统地学习这些内容,读者可以更高效地使用C语言进行编程,并解决...
·提供了mysql语句、函数、配置选项和实用工具的一个完整手册。 ·给出了几个指导章节用于帮助新手入门。 ·为php、perl和c语言提供了应用程序编程接口(api)。 ·在每章的api开头部分提供了简要的指南。 ...
### S3C2416核心板开发板硬件...综上所述,S3C2416核心板及其开发板为各类嵌入式系统设计提供了强大的硬件基础,其详细的硬件手册则为开发者提供了全面的技术指导和法律提示,是进行相关项目开发不可或缺的参考资料。