当我们初始化一个指针或给一个指针赋值时,赋值号的左边是一个指针,赋值号的右边是一个指针表达式。在我们前面所举的例子中,绝大多数情况下,指针的类型和指针表达式的类型是一样的,指针所指向的类型和指针表达式所指向的类型是一样的。

例:

1。 float f=12.3;

2。 float *fptr=&f;

3。 int *p;

在上面的例子中,假如我们想让指针p指向实数f,应该怎么办呢?是用下面的语句吗?

p=&f;

不对。因为指针p的类型是int*,它指向的类型是int。表达式&f的结果是一

个指针,指针的类型是float*,它指向的类型是float。两者不一致,直接赋值的方法是不行的。为了实现我们的目的,需要进行"强制类型转换":

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)

{

char c;

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=某个数,这个数必须代表一个合法的地址;

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。

好了,现在我们已经知道了,可以把指针的值当作一个整数取出来,也可以把一个整数值当作地址赋给一个指针。

linux 强制类型转换,转载 指针强制类型转换相关推荐

  1. c语言不通类型指针转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...

    强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...

  2. C语言里 指针变量强制类型转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...

    强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...

  3. 指针强制类型转换触发内存自动对齐

    C语言的指针是我们操作很灵活,但是也留下了不少坑,今天工作遇到了一个指针的坑,这里复现一下: 指针类型强制转换,并进行解引用,引起的内存对齐问题. (一)问题复现: 运行环境:Ubuntu 16.04 ...

  4. C语言指针强制类型转换

    概要: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给 ...

  5. c语言 void**类型转换,void指针类型强制转换

    如何将一个void*强制转换成行指针类型? void*指针可以转换成任何类型的指针. 强制转换即可,比如 (int *)(void *)p; 假设你的数组有N行M列的int型数据. int arr[N ...

  6. C++中的向上类型转换和向下类型转换+四种强制类型转换

    转自博客:http://blog.csdn.net/wangweitingaabbcc/article/details/7720979# 在c++的世界中有这样两个概念,向上类型转换,向下类型转换,分 ...

  7. c语言强制转换例子,关于强制类型转换(c语言)(示例代码)

    因为今天看的代码中用到了结构体的强制类型转换,就很想了解一下结构体的强制类型转换是怎样的. 一个结构体如下: 在下面这段代码中rbuf->reqCmdBuf是一个空指针,首先将这个空指针赋值给一 ...

  8. c语言数组变量的类型转换,C语言强制类型转换

    概要: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给 ...

  9. JS强制类型转换和隐式类型转换

    一.隐式类型转换 隐式类型转换会自动根据运算符进行类型转换.隐式类型转换的情况主要有以下几种. 如果表达式中同时存在字符串类型和数字类型的操作数,而运算符使用加号+,此时 JavaScript 会自动 ...

最新文章

  1. 2017 04 04 省选模拟
  2. idea redis 插件_Redis客户端RDM收费后,还有哪些开源的替代品呢?
  3. 必背单词_研究生满大街走?真实数据来啦 真题必背单词Day10
  4. 为什么python打包的应用那么大_浅谈python3打包与拆包在函数的应用详解
  5. 数据科学、人工智能TED演讲TOP 10
  6. NOI2011 阿狸的打字机题解
  7. Mysql原理、主从复制、半同步复制及基于SSL复制
  8. 解决弹出的窗口window.open会被浏览器阻止的问题
  9. 神经网络的迭代次数有可能被计算出来吗?
  10. 人生的两大奇迹思维:杠杆效应+飞轮效应《方法论》
  11. 2022年全球市场聚苯硫醚纤维总体规模、主要生产商、主要地区、产品和应用细分研究报告
  12. php获取图片rgb值,判断图片是否纯黑纯白
  13. Dango Web 开发指南 学习笔记 3
  14. 【软件应用】word数学公式插件TeXsword安装
  15. chrome使用的开源工程介绍
  16. 拼多多这样来挑选关键词|百择电商
  17. C# 基础之Linq编程
  18. 清华才子王垠​加入华为职级22,前阿里P10赵海平加入字节跳动,职级或为4+
  19. Codeforces 1546 D. AquaMoon and Chess —— 组合数学,一点点想法
  20. QQ空间相册脸部识别

热门文章

  1. Internal error. Please report to https://code.google.com/p/android/issues
  2. ArcGIS如何获取地理要素的几何属性
  3. Tinkpad T480设置U盘启动
  4. HTM+CSS实现立方体图片旋转展示效果
  5. 通过快递鸟如何接入申通快递电子面单
  6. 屏山计算机学校,四川省屏山县职业技术学校计算机应用专业好吗
  7. 大数据分析02——成都二手房(热度)
  8. 美颜sdk算法总概——美白
  9. sqlmap tamper mysql_sqlmap之常用tamper脚本
  10. 300色 柔和色彩渐变色卡(十六进制)