c语言的变量和指针,怎么理解?
学会应用指针是C语言程序员的分水岭,也是C程序员级别的试金石。
变量可以分为基础变量、数组变量、指针变量,其中数组变量非常特殊,可以进一步分为基础数组变量和指针数组变量,所以暂时不考虑数组变量。假设我们在32位计算机上工作。
先看看简单的基础变量。
short var = 0x1234;var = 0x4321;printf("var = %#x\n", var);printf("&var = %#x\n", &var);// 程序输出:(为方便说明这里的地址是虚构的,实际情况很可能不一样)// var = 0x4321// &var = 0xABC00000
这里考虑short
为2字节大小。第一行代码是声明语句,都知道short
是变量类型,var
是变量名称,0x1234
是变量值。第二行代码是赋值语句,将变量var
的值修改为0x4321
。第三行代码是将变量var
的值输出。第四行代码是将变量var
的地址输出,C语言中&
表示取变量地址。
那变量本身和数据,计算机是怎么存储和使用的?
上图是变量在内存中的分布情况。变量声明语句会让编译器自动分配2字节大小的内存,例如:内存0xABC00000~0xABC00001
,而变量名只是给程序员使用这个内存数据的代称。比如,接下来赋值语句var = 0x4321;
就让变量var
的内存数据被修改为0x4321
。请记住这些事所有变量的特性,只是他们所存储的数据值类型有差异。
继续上面的代码,在看看简单的指针变量。
short *pvar = (short *)0x12340000;pvar = &var;printf("pvar = %#x\n", pvar);printf("*pvar = %#x\n", *pvar);// 程序输出:(接着上面一段代码)// pvar = 0xABC00000// *pvar = 0x4321
第一行代码是声明语句,都知道short *
是指针变量类型,pvar
是变量名称,(short *)0x12340000
是变量值。第二行代码是赋值语句,将变量pvar
的值修改为&var
(示例中是0xABC00000
)。第三行代码是将变量pvar
的值输出。第四行代码是指针变量特有的操作*
,稍后讲解。
那指针变量本身和数据,计算机是怎么存储和使用的?
上图是指针变量pvar
和普通变量var
在内存中的分布情况。在32位系统中中,编译器会为指针变量自动分配4字节大小的内存,例如:内存0xDEF00000~0xDEF00003
,而变量名是给程序员使用这个内存数据的代称。因赋值后,这个指针变量pvar
的数据值正好是变量var
的首地址,一般就称呼pvar
是指向var
的指针。此时两种类型变量就能互相转化为另一种类型变量。
继续上面的编码,看看这段互转的代码。
printf("complex var = %#x\n", *(short *)(&var));printf("complex pvar = %#x\n", &(*pvar));// 程序输出:(接着上面一段代码)// complex var = 0x4321// complex pvar = 0xABC00000
不知细心的读者发现没有,虽然变量var
占用2字节内存,但指针变量pvar
只指向var
的首地址0xABCD0000
,那*pvar
怎么知道数据是占用2字节呢?简单,声明指针变量时指定了short *
类型。那要是强行将类型转换为char *
或int *
会怎样呢?
char *pchar = (char *)&var;int *pint = (int *)&var;printf("converted *pchar = %#x\n", *pchar);printf("converted *pint = %#x\n", *pint);// 程序输出:(接着上面一段代码)// converted *pchar = 0x21// converted *pint = 0x24321
变量pint
可能输出其他值,或者它的高位2字节数据可能随机。
指针变量已经基本入门。继续深入下去会涉及到指针变量运算(+/-运算)、数组指针、多级指针(指针的指针)、函数指针等。
c语言的变量和指针,怎么理解?相关推荐
- 64位程序怎么判断指针是否有效_C 语言指针怎么理解?
注: 看完这篇一定会让你理解透彻指针的本质 是的,这一篇的文章主题是「指针与内存模型」 说到指针,就不可能脱离开内存,学会指针的人分为两种,一种是不了解内存模型,另外一种则是了解. 不了解的对指针的理 ...
- c语言多维数组指针地址讲解,C语言入门之多维数组的指针变量
一.多维数组地址的表示方法 设有整型二维数组a[3][4]如下: 0 1 2 3 4 5 6 7 8 9 10 11 设数组a的首地址为1000,各下标变量的首地址及其值如图所示. 在前面曾经介绍过, ...
- printf 指针地址_c语言对指针的理解
先来讲一下本人学指针的经历:大一的时候刚接触c语言对指针这东西真的是太迷了,感觉麻烦难懂不想其他语言一样.但是搞懂以后就被指针的魅力吸引甚至喜欢上c语言.不多讲,开始!(文章可能有些长,但放心全是基础 ...
- go 指针变量和普通变量的转化_C语言 | 指向结构体变量的指针变量
"要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人-万中无一" --包租婆这道理放在C语言学习上也一并受用.在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语 ...
- 如何理解c语言的变量,C语言中变量的理解.PDF
C语言中变量的理解 年第 期 建建 电电 脑脑 2011 3 59 C 语言中变量的理解 潘 莉 河南经贸职业学院 东校区 河南郑州 ( 冤 450009 ) 摘 要 在很多 级语言的基础语法中都有变 ...
- c语言函数的参数是结构变量,何去运用结构体变量和结构的变量的指针作为函数的参数...
在C语言中我们如何去运用结构体变量和结构的变量的指针作为函数的参数呢,其实我们对于结构体的变量是有一定的了解的,他们就是将一个结构体变量的值传递给另外一个函数,那么这种有三种方法,希望大家都能够了解一 ...
- c语言中什么是指针 什么是指针变量,C语言指针是什么?
代码清单 1:自定义函数交换两个变量的值(错误的解决方法) #include #include /*--自定义函数:交换两个变量的值--*/ void swap(int a, int b) { int ...
- 指针,指针变量,指针变量指向的一些理解
对于指针,指针变量,指针变量(通常简写成指针)指向的一些理解 1.指针的定义: 首先假设有一个内存单元,每一个内存单元对应着一个相应的编号,即为该内存单元的地址,该地址也就是我们所说的指针. 2.指针 ...
- 探究数组变量和指针的关系(C语言)
结论:数组变量可以被看作是const的指针变量 (提示:如果对const指针的所有的操作都可以对数组变量做,而且结果一致,就说明数组变量就是指针:如果有某个操作不能做,或者结果不一致,就说明不是指针) ...
最新文章
- 数据库 DB database SQL DBMS
- Qt Creator图片
- mysqldump命令
- Java Bag模型模拟
- 为什么基于内容的读取缓存 (CBRC) 对于 Horizon View 和 VSAN 如此重要?
- 6个座位办公室最佳位置_四人办公室座次的首选最佳座位在哪儿
- 信息学奥赛一本通 2053:【例3.3】三个数
- VC6和VS2005(及2010)的一些区别总结
- 基于帕累托最优的多目标SNP选择
- 研发软件测试费计入什么科目,研发支出中测试费计入什么科目
- matlab 与 mathmatica 编程对比(Vyi个人学习笔记)
- 计算机系大二学期计划范文,大二学期学习计划范文6篇
- 剪辑视频怎么学?手把手教你自学视频剪辑
- MSDTC无法启动的解决办法
- Armijo-Goldstein准则与Wolfe-Powell准则
- 塔石E18D mqtt连接onenet
- 计算机视觉中的深度深度学习中的深度
- 如何在局域网架设FTP(特别简单方便)
- 计算机专业笔记本硬盘需要多少,计算机硬盘是否使用分区?几个区最好?系统磁盘有多大?...
- Pdftoword:最精准的pdf to word文件转换器
热门文章
- VLAN Aggregation(VLAN 聚合,也称Super VLAN)
- 天载股票开户大宗商品价格上涨引关注
- 【hh】我胡汉三又回来了
- 【Neo4j构建知识图谱】Python调用cypher语言(1):只需5行代码一次性完成节点、关系、属性的创建
- Learning TypeScript 0x3 面向对象编程
- matlab premnmx归一化函数的使用 1、premnmx 预处理数据使数据的最小值和最大值分别为-1和1. [PN,minp,maxp,TN,mint,maxt] = premnmx(P,T)
- markdown如何打印拼音
- 为什么服务器未响应ins,9修复Instagram无法正常工作,加载或崩溃的最佳方法
- 谷歌浏览器如何查css,谷歌浏览器查看编辑元素CSS样式_谷歌工具
- 2019年美亚杯电子数据取证大赛-内存取证