指针类型转换(转)

当我们初始化一个指针或给一个指针赋值时,赋值号的左边是一个指
针,赋值号的右边是一个指针表达式。在我们前面所举的例子中,绝大
多数情况下,指针的类型和指针表达式的类型是一样的,指针所指向的
类型和指针表达式所指向的类型是一样的。
例十五:
float f=12.3;
float *fptr=&f;
int *p;
在上面的例子中,假如我们想让指针p 指向实数f,应该怎么办?
是用下面的语句吗?
p=&f;
  不对。因为指针p 的类型是int *,它指向的类型是int。表达式
&f 的结果是一个指针,指针的类型是float *,它指向的类型是float。
两者不一致,直接赋值的方法是不行的。至少在我的MSVC++6.0 上,对
指针的赋值语句要求赋值号两边的类型一致,所指向的类型也一致,其
它的编译器上我没试过,大家可以试试。为了实现我们的目的,需要进
行"强制类型转换":
p=(int*)&f;
   如果有一个指针p,我们需要把它的类型和所指向的类型改为
TYEP *TYPE, 那么语法格式是: (TYPE *)p;
这样强制类型转换的结果是一个新指针,该新指针的类型是
TYPE *,它指向的类型是TYPE,它指向的地址就是原指针指向的地址。
而原来的指针p 的一切属性都没有被修改。(切记)
一个函数如果使用了指针作为形参,那么在函数调用语句的实参和
形参的结合过程中,必须保证类型一致,否则需要强制转换
例十六:
void fun(char*);
int a=125,b;
fun((char*)&a);
void fun(char*s)
{
charc;
c=*(s+3);*(s+3)=*(s+0);*(s+0)=c;
c=*(s+2);*(s+2)=*(s+1);*(s+1)=c;
}
   注意这是一个32 位程序,故int 类型占了四个字节,char 类型占一个
字节。函数fun 的作用是把一个整数的四个字节的顺序来个颠倒。注意
到了吗?在函数调用语句中,实参&a 的结果是一个指针,它的类型是
int *,它指向的类型是int。形参这个指针的类型是char *,它指向
的类型是char。这样,在实参和形参的结合过程中,我们必须进行一
次从int *类型到char *类型的转换。结合这个例子,我们可以这样来
想象编译器进行转换的过程:编译器先构造一个临时指针char *temp,
然后执行temp=(char *)&a,最后再把temp 的值传递给s。所以最后的
结果是:s 的类型是char *,它指向的类型是char,它指向的地址就是
a 的首地址。
   我们已经知道,指针的值就是指针指向的地址,在32 位程序中,
指针的值其实是一个32 位整数。那可不可以把一个整数当作指针的值
直接赋给指针呢?就象下面的语句:
unsigned int a;
TYPE *ptr; //TYPE 是int,char 或结构类型等等类型。
a=20345686;
ptr=20345686; //我们的目的是要使指针ptr 指向地址20345686
ptr=a; //我们的目的是要使指针ptr 指向地址20345686
编译一下吧。结果发现后面两条语句全是错的。那么我们的目的就不能
达到了吗?不,还有办法:
unsigned int a;
TYPE *ptr; //TYPE 是int,char 或结构类型等等类型。
a=N //N 必须代表一个合法的地址;
ptr=(TYPE*)a; //呵呵,这就可以了。
严格说来这里的(TYPE *)和指针类型转换中的(TYPE *)还不一样。这里
的(TYPE*)的意思是把无符号整数a 的值当作一个地址来看待。上面强
调了a 的值必须代表一个合法的地址,否则的话,在你使用ptr 的时候,
就会出现非法操作错误。
想想能不能反过来,把指针指向的地址即指针的值当作一个整数取
出来。完全可以。下面的例子演示了把一个指针的值当作一个整数取出
来,然后再把这个整数当作一个地址赋给一个指针:
例十七:
int a=123,b;
int *ptr=&a;
char *str;
b=(int)ptr; //把指针ptr 的值当作一个整数取出来。
str=(char*)b; //把这个整数的值当作一个地址赋给指针str。
现在我们已经知道了,可以把指针的值当作一个整数取出来,也可
以把一个整数值当作地址赋给一个指针。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

143. Reorder List

Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do this in-place without altering the nodes values. For example,Given {1,2,3,4}, reorder it to {1,4,2,3}. public void ReorderList(ListNode head) {if(h…

Halcon图像滤波方法与原理概述

目录简介Halcon算子与算法原理基础滤波a、均值滤波b、中值滤波c、高斯滤波d、导向滤波简介 图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和…

碎片化学习不是学习碎片,看这篇了解碎片化学习的真相

高效学习的定义:找到最适合自己的学习手法,在相对短的时间内集中注意力,以解决一个工作生活当中的难题为目的着手学习,你需要勤加练习,有时候还需要向名师求助。——许岑为什么会出现碎片化学习? 随着科技的…

一篇能加深理解linux 虚拟文件系统的博文

URL: http://asionius.com/article/9 https://www.ibm.com/developerworks/cn/linux/l-vfs/转载于:https://www.cnblogs.com/rocklee25/p/6926267.html

如何强制ffmpeg编码时输出一个关键帧

原文地址:http://www.ffmpeg.com.cn/index.php/%E5%A6%82%E4%BD%95%E5%BC%BA%E5%88%B6ffmpeg%E7%BC%96%E7%A0%81%E6%97%B6%E8%BE%93%E5%87%BA%E4%B8%80%E4%B8%AA%E5%85%B3%E9%94%AE%E5%B8%A7 如何强制ffmpeg编码时输出一个关键帧 AVCodecContext *c //编码器环境句…

Halcon深度学习环境搭建(win下)全网最全教程

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/cashmood/article/details/105042928 文章目录halcon深度学习介绍系统与环境搭建1、对电脑系统与硬件…

第二周进度及工作量统计

项目:词频统计修改 项目类型:个人项目 项目完成情况:已完成 项目改进:第二次改进 项目日期:2016.9.14----2.16.9.14 CCSEIT分析需求,设计15:2015:30010编码实现15:3016:20050文档程序说明,随笔2…

p1484 种树

传送门 题目 cyrcyr今天在种树,他在一条直线上挖了n个坑。这n个坑都可以种树,但为了保证每一棵树都有充足的养料,cyrcyr不会在相邻的两个坑中种树。而且由于cyrcyr的树种不够,他至多会种k棵树。假设cyrcyr有某种神能力&#xff0c…

Dalsa线扫相机SDK开发-小试牛刀(1)

拿到了dalsa相机,可以用Sapera软件配置相机,进行图像采集。但是自己开发的话就得撸起袖子写代码了,查了两篇不错的博文,作为指导。 Sapera帮助文档 - 《好好先生》专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/liubing8609/a…

用FFMPEG SDK进行视频转码压缩时解决音视频不同步问题的方法(转) PTS DTS

用FFMPEG SDK进行视频转码压缩的时候,转码成功后去看视频的内容,发现音视频是不同步的。这个的确是一个恼火的事情。我在用FFMPEG SDK做h264格式的FLV文件编码Filter的时候就碰到了这个问题。经过研究发现,FFMPEG SDK写入视频的时候有两个地方…

深度学习环境搭建(GPU)CUDA安装(完全版)

文章目录1、查询电脑硬件2、环境搭建与软件安装1、安装CUDA运算平台软件2、安装cuDNN支持包3、配置环境变量3、验证CUDA与cuDNN安装前几天在看深度学习。因为对深度学习不是很了解,在配置环境时走了许多弯路,也总是战战兢兢的。现在对深度学习的环境搭建…

Linux 中的文件压缩与解压

.tar tar xvf FileName.tar # 解压 tar cvf FileName.tar DirName # 压缩 .gz gunzip FileName.gz # 解压 gzip -d FileName.gz # 解压 gzip FileName # 压缩 .tar.gz 和 .tgz tar zxvf FileName.tar.gz # 解压 tar zcvf FileName.tar.gz DirName # 压缩 .bz2 bzip2 -d FileNam…

Unity3D游戏开发之自由视角下的角色控制

秦元培的博客:http://blog.csdn.net/qinyuanpei/article/details/39125353 1,[Unity3D]Unity3D游戏开发之角色控制漫谈 2,[Unity3D]Unity3D游戏开发之自由视角下的角色控制 3,[Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色控制效果 转载于:h…

Pycharm用鼠标滚轮控制字体大小

一、pycharm字体放大的设置 File —> setting —> Keymap —>在搜寻框中输入:increase —> Increase Font Size(双击) —> 在弹出的对话框中选择Add Mouse Shortcut 在弹出的对话框中同时按住ctrl键和鼠标滚轮向上滑。 二、…

Halcon自定义函数封装方法(全网最详细)

文章目录1、名词解释2、例子介绍1、处理原图与任务:2、代码与解析:3、Halcon函数封装方式①明确需求②选取函数部分进行函数创建,更改函数接口③运行验证与函数更改操作有网友说不太清楚这个halcon函数的封装方法。今天写个教程帖子&#xff…

ffmpeg库音频解码示例

#include <stdio.h> #include <stdlib.h> extern "C"{// #include "avcodec.h" #include "avformat.h" } int main(char arg,char *argv[]) { char *filename "02.swf"; av_register_all();//注册所有可…

SQL Where in list 问题

不过,这种做法有两个缺陷1.Oracle In列表的数目有限制(1000)2.不能复用执行计划,每次几乎都是硬解析.3.In拼接可能存在SQL注入的风险

readn writen实现linux下socket缓冲区读写

socket上的read write 操作不同与一般的文件IO操作&#xff0c;socket上的用read write读写的字节数可能比要求的少,但这并不是错误&#xff0c;原因是socket的缓冲区可能已经达到了极限。此时所需要的就是再次调用read write 以写入或输出剩余的字符。这种情况在socket中很常见…

傅里叶变换进行缺陷检测detect_indent_fft.hdev(源代码与详细解析)

文章目录简介程序解析处理结果预览算法讲解简介 detect_indent_fft.hdev是halcon的示例程序&#xff0c;是傅里叶变换进行缺陷检测的一个例子&#xff0c;主要是傅里叶变换在复杂背景下的缺陷检测。 这个程序展示了如何利用快速傅里叶变换&#xff08;FFT&#xff09;对塑料制…

lua环境搭建

前言 Linux & Mac上安装 Lua 安装非常简单&#xff0c;只需要下载源码包并在终端解压编译即可&#xff0c;本文介绍Linux 系统上&#xff0c;lua5.3.0版本安装步骤&#xff1a; Linux 系统上安装 [rootgitlab ~]# mkdir /app/tools/lua -p [rootgitlab ~]# cd /app/tools/l…