C语言指针类型和类型转换

指针类型

指针是强类型,意思是特定类型的指针变量存放特定类型变量的地址,比如int * 需要一个指向整形的指针来存放整形数据的地址,char* 需要一个指向字符型的指针来存放字符型数据的地址,那为什么说指针是个强类型呢?指针不仅用来表示变量的地址,同时也得使用指针来解引用地址的内容,以此方便修改和使用变量的值。说到这里,我们又得来回顾一下数据类型所占空间的大小(32位机器)

int - 4byte
char - 1byte
float - 4byte

我们用一个实例来说明指针是强类型这个特性,我们知道内存是连续的,我们定义一个变量

int a = 1025;

这个变量用二进制表示为0x10000000001,在内存中的示意可表示如下

字节 byte3 byte2 byte1 byte0
二进制值 00000000 00000000 00000100 00000001
假设地址 0x203 0x202 0x201 0x200

整形变量的最高位是符号位,也就是正负符号位

类型转换

我们这时去用代码来看一下整形指针、字符型指针的区别

#include <stdio.h>int main()
{int a = 1025;int *p;p = &a;printf("size of integer is %d bytes\n",sizeof(int));printf("Address = %d, value = %d\n",p,*p);return 0;
}

上面的代码我们知道打印出来的值是a的地址和1025这个值

我们再定义一个字符型指针的变量,再来打印变量的值,将上面的代码修改为

#include <stdio.h>int main()
{int a = 1025;int *p;char *p0;p = &a;printf("size of integer is %d bytes\n",sizeof(int));printf("Address = %d, value = %d\n",p,*p);p0 = (char *)p;//这里要做类型转换printf("size of char is %d bytes\n",sizeof(char));printf("Address = %d, value = %d\n",p0,*p0);return 0;
}

打印出来的内容我们看一下

从上面的打印结果来看,p和p0的地址是一样的,那么为什么打印的值却是不同的呢?这里就是数据类型的问题,我们再回到上面的表中,1025 = 0b00000000 00000000 00000100 00000001,整形是以4个字节大小存储的,字符型是以1个字节大小存储的,字符型指针表示整形指针时会将高3位的数据丢失,只留下最低位的字节数据,也就是00000001,所以这里打印出来的值是1。

为了进一步理解这个指针类型,我们看一下p0+1和*(p0+1)的值是多少,代码如下

#include <stdio.h>int main()
{int a = 1025;int *p;char *p0;p = &a;printf("size of integer is %d bytes\n",sizeof(int));printf("Address = %d, value = %d\n",p,*p);p0 =(char *) p;printf("size of char is %d bytes\n",sizeof(char));printf("Address = %d, Vaule = %d\n",p0,*p0);printf("Address of p0+1 = %d, Vaule of *(p0+1) = %d\n" ,p0+1,*(p0+1));return 0;
}

从打印结果来看,p0+1的地址增大一个字节,解引用的值为4,这里的4也就是00000100,上面是强制将p的地址存入p0,它俩的数据类型不同,所存储的内容也有所不同(仅有一个字节数据存入)。提醒我们在使用指针变量时要时刻考虑数据类型,以及是否适合做类型转换。

C语言指针类型和类型转换相关推荐

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

    关于C语言指针类型 强制转换  引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...

  2. C语言指针类型和所指数据的类型要一致吗

    C语言指针类型和所指数据的类型必须要一致吗 网上很多答案是:"必须,不一致会出现语法错误",但是 no try no know. 首先看下我的环境: 下面是代码: #include ...

  3. 深入理解C语言指针类型

    C语言指针类型 这部分内容其实很简单,本来不想写的,但是一开始我还真没理解指针类型,所以后来想想还是写一个吧!得了废话少说直接上代码 #include <stdio.h> #include ...

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

    指针与强制类型转换 变量数据类型的含义 指针数据类型的含义 有符号数和无符号数的区别 变量数据类型的含义 所有类型的数据存储在内存中都是按照二进制格式存储的,所以内存中只有0和1,并不知道是int的还 ...

  5. C语言指针类型的意义

    ▶️文章目录 ✅1.指针的概念 ✅2.指针和指针类型 ✅3.野指针 ✅3.1野指针成因 ✅3.2如何规避野指针 1.指针的概念 指针就是地址,口语中说的指针通常指的是指针变量 指针理解的2个要点: 1 ...

  6. c语言的返回类型是指针变量吗,C语言-指针类型

    改值场景示例 - 改变 n 的值 的函数 void change(int n) { n = 10; } int main() { int a = 20; - 这里只能把 变量a 的值传到 change ...

  7. c语言指针的强制类型转换,c语言指针的强制转换

    在c语言中经常看到以下类似的代码: int x = 1; (char*)&x; 这样的形式的代码,这个里面就涉及一个类型转换的问题. 以下是在VC6.0中调试的结果 代码: int main( ...

  8. c语言指针类型占多少字节,关于指针占多少个字节

    开章明义,在32位系统中指针占四个字节: 说道这个问题,学过C语言的都知道,我们在定义一个指针的时候需要说明指针的类型,那么按道理来说,不同类型的指针大小应该不同啊,整形占四个字节,浮点占八个字节,其 ...

  9. C语言 指针 类型的用法大汇总(指针/引用/取值) *与

    今天刚好看汇编需要,就学了学. 本篇文章会不断完善,有疑问,请在评论区留言 对星号 * 的总结 1.表示乘法,例如int a = 3, b = 5, c; c = a * b;,这是最容易理解的. 2 ...

  10. C语言char类型及其类型转换的变化

    目录: char类型 转义字符 char类型 首先我们要知道char类型为一个字节. 而且要知道他在计算机中的储存方式. 一个字节8个bite,int类型32bite,0x00 00 00 01刚好没 ...

最新文章

  1. R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(手动编码添加均值、标准偏差)实战(dot plot)
  2. 纵横公路造价软件学习_20年最新公路造价实战培训课程
  3. 投资学习网课笔记(part3)--基金第三课
  4. Android 安全机制概述
  5. 《Webservice的应用与开发》学习笔记 ·001【Web服务、XML文档】
  6. Android下xml中RelativeLayout布局常见属性
  7. Visual Studio 2010 SP1将支持HTML5和CSS3
  8. java 循环读取指定文件夹下所有文件
  9. 计算机多媒体制作三级证书,多媒体作品制作员(师)国家职业标准
  10. 周志华最新论文 | 深度森林:探索深度神经网络以外的方法
  11. 智能家居有线系统与无线系统,该怎么选?
  12. 前门狗不理双人餐一份 - 北京团购网|京东团购
  13. mysql反思范文_MySQL学习笔记(一)
  14. 浅谈千万级高性能高并发网站架构
  15. FortiGate防火墙GRE隧道监控
  16. 定制NFC卡片/ntag213芯片卡/手机NFC感应卡片
  17. amazeui学习笔记--css(常用组件6)--图标Icon
  18. Java学习查漏补缺及知识点整理
  19. 微信摇心愿如何选不同服务器,王者荣耀摇心愿正式开启,皮肤概率公示,心愿怎么选?用这招稳赚...
  20. 近视眼怎么恢复视力?

热门文章

  1. Win11 在线安装QT5.15.2教程
  2. 机器学习之邹博笔记1
  3. Java认证与授权服务JAAS基础概念
  4. imx8 uuu烧录
  5. imx8mm偶现启动内核失败问题分析报告
  6. element tree不刷新视图_安卓从入门到进阶第五章(视图查看)
  7. adc信噪比matlab测试代码,ADC测试matlab代码
  8. Python实现word转pdf
  9. matlab实现长除法,【网安智库】基于长除法的BCH(15,7)译码算法
  10. Xmind思维导图模板分享