浅议指针

指针--------存储地址的变量
int  a=5;
int*  p=&a;
int  b=*p;

执行以上操作后,b这个整型变量里的值是多少?  答 : 5
  p这个变量里的值是多少?  答 : a的地址(不是int型数字5!)   

为什么呢?
int  a=5; 这是个最常见的定义变量并赋值语句,执行该句后,内存中会分配出一个4个字节(通常为4个字节,具体大小由系统决定)大小的空间,该空间的名字为a,并把数字5赋值到了该空间,并且该空间只能用来存放整型数字,当然该空间会有一个内存地址(每个变量是放在内存中的,系统会自动为该变量分配一个地址,该地址不是我们能决定的),用运算符&就可以得到该空间的地址(&a),该地址也是一种类型的数值,但这种类型既不是int型,也不是double,float型,那这种类型值应该赋值给一个什么类型的变量呢?我们可以这样定义一个变量int*  p;(不建议写成int  *p,*p会让人误以为定义了一个变量*p,*p显然不是一种合法的标示符!)p这个变量就变成了一个专门用来存放int型整数地址的变量,注意:p也是一个变量!也有类型!它的类型是int* 型(不是int型!)!,它的大小通常是4个字节,所以我们可以把一个整型数字的地址赋值给这个变量,前面已经说过了,要想得到int型变量的地址,只需使用&运算符就行,所以我们可以通过这种方式int*  p=&a;把int型变量的内存地址赋值给p变量(p就是一个指针!因为这个变量是int*  p这样定义的,这就决定了p这个变量是专门用来存放int型变量地址的变量,此时,我们可以说p指向了a)

再来看int  b=*p;这句,*p意思就是说拿着p变量里的值(当然是一个地址),去找这个值表示的内存空间(即:p指向的内存空间),执行int*  p=&a;后,p的值已经变成了a在内存中的地址,所以执行int  b=*p;后,b就变成了5。

int  a=5;
int*  p=&a;
int  b=*p;
以上3句总共定义了几个变量?开辟了几个空间?各变量值是多少?
答:3个变量,3个空间,a的值为5(假定该变量在内存中的地址为0x123 (地址通常用16进制数字表示)),p的值为0x123(前面已经假定a的地址为0x123,当然该变量也会有一个内存地址,该地址可能为0x122 (当然也可能为其他值,但p总会有个地址!)),b的值为5(该变量当然也有内存地址!)

疑惑点:
  int*  p;和*p;这两中* p竟然会有不同的用法,老是弄不清到底怎么用。
  若为了让初学者更易学会指针,其实c语言完全可以再增加几种基本类型,如:intp型,doublep型,floatp型,这几种类型和int,double,float等级完全并列,intp类型就是一个专门用来定义存储整型变量地址的变量,如:int  a; intp  p=&a;doublep型,floatp型同理。
  使用该变量p指向的变量时可以调用一个函数int  intvalue(intp  p);来得到p指向的int型变量的值,若增加这两中用法后初学者会很易的学会使用指针,而不必纠结与两只*p,但由于可以用struts定义自定义类型,该类型的变量也有地址,若想得到这种类型变量的地址怎么办呢,显然用上面的方式已经不能满足需求,所以c语言直接使用了*这种方式来定义存储这种类型变量的地址的变量。
  
总结:
  int*  p=&a;定义了一个变量,p这个变量就变成了一个专门用来存放int型整数地址的变量,当然该变量可以被赋值。*p意思就是说拿着p变量里的值(当然是一个地址),去找这个值表示的内存空间(即:p指向的内存空间),执行int*  p=&a;后,p的值已经变成了a在内存中的地址,所以执行int  b=*p;后,b就变成了5。
  
  
  
  
  
  

浅议指针

时间: 2024-10-07 19:14:32

浅议指针的相关文章

再议指针---------函数回调(qsort函数原理)

我们能否写一个这样的函数: 可以对任何类型数据排序 任何人在使用该函数不需要修改该函数代码(即:用户可以不必看到函数源 码,只会调用就行) 思考: 用户需要排序的数据的类型千变万化,可能是int型,也有可能是自定义的结构体类型,各种类型的大小比较规则是不一样的,这样看来实现一个这样全能的排序函数似乎不可能. 但具体需要排序的类型应按照什么规则确定大小只有使用该函数的用户最清楚,那我们可不可以把实现比较大小的功能交给用户来完成了,到时候用户只需告诉该函数比较规则(函数)在什么位置,这样排序函数不就

【VMware虚拟化解决方案】浅议VMware虚拟化环境下的安全策略

浅议VMware虚拟化环境下的安全策略 刘志勇 通过多年的发展,VMware在虚拟化市场处于领军地位,很多企业部署了VMware虚拟化方案,笔者所在的企业同样也不例外. 经过多年来的信息化建设,出于对安全防护的高度重视,为了物理边界和终端安全,企业部署了安全系统,包含了安全网关.应用防护.防病毒软件等等. 但是,企业在信息化建设大量应用了VMware虚拟化的方案,虽然早先做到了物理边界和终端安全,但虚拟化系统的主机漏洞防护却面临着挑战,本文作者就尝试阐述在VMware虚拟化环境下如何制定安全策略

浅议SNMP安全、SNMP协议、网络管理学习

相关学习资料 tcp-ip详解卷1:协议.pdf(重点看25章SNMP部分) http://www.rfc-editor.org/rfc/rfc1213.txt http://www.rfc-editor.org/rfc/rfc1155.txt http://www.rfc-editor.org/rfc/rfc1157.txt http://network.51cto.com/art/201007/209214.htm http://zh.wikipedia.org/wiki/SNMP http

浅谈指针的比较

一.前言 有人说指针是C语言的灵魂,也有人说没学好指针就等于不会C语言. 虽然在现代C++中一般都是推荐尽量避免使用原生的raw指针,而是以smart pointer 和reference替代之.但是无论怎样,对于C/C++来说,指针始终是个绕不过去的坎.究其原因,是因为C/C++都是支持面向底层操作的语言,而面向底层操作就得能操纵内存,这个时候就需要指针了.为什么呢?个人觉得指针实际上就是对机器语言/ASM中的通过虚拟地址操作内存的这一行为的一种抽象. 例如 movl %eax, (%edx)

浅谈指针的偏移

记得当初学习指针的时候,总是把指针和地址混为一谈,总以为说到指针就是指某个地址而已,后来加强对各类指针的认识以后,才认识到指针不止是简单的地址. 指针是一种类型,通过类型可以声明一个变量并保存一个内存地址,不同类型的指针对保存的地址会有不同的解释,编译器根据指针的类型(对应的偏移量)解引用出相应的数据. 首先在32位程序设计里,指针大小为4bytes,满足2^32 寻址范围. 到底偏移多少: 曾经探究过一个问题,代码如下: int a[4][2] = { 0, 1, 2, 3, 4, 5 ,7,

浅谈指针

指针:一个用来存储数据存储地址的变量. int a=10;  a变量里面存储的数据0 1按照int 的长度解析为数据 int *p=&a; p变量里面存储的数据0 1解析为地址,只是这个地址(这个地址是这段空间的首地址)标号的那段空间里面存储的是a的值,这里的p是给这段地址的取的名字用来给程序员看的,这里的a是给这段地址里面存储内容所取得名字来给程序员看的.

浅议计算机在金融业中的应用

近年来,计算机技术在人们的日常工作生活中得到了广泛的应用.它贯穿于各个行业的方方面面,预示着我国的电子计算机技术得到深入的发展.同样的,电子计算机技术在金融行业中也得到了广泛的应用,促进了我国金融行业的变革.但是,计算机在我国现阶段金融业中的应用水平还很差,同时也面临着许多挑战.通过分析存在的问题,找到解决问题的措施.总结经验,从而尽快改变计算机在我国金融业中的应用. 金融软件开发就显得十分的重要.中国论文网 http://www.xzbu.com/9/view-5085577.htm 计算机金

【C语言】 浅谈指针

指针是就是地址,是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容:指针的类型.指针所指向的 类型.指针的值或者叫指针所指向的内存区.指针本身所占据的内存区.让我们分别说明. 首先,先罗列出几种常见的类型: int p;   //这是一个普通的整型变量int *p;  //首先从P处开始,先与*结合,所以说明P是一个指针,然后再与int结合,说明指针所指向的内容的类型为int型.所以P是一个返回整形数据的指针 int p[3];  //首先从

再议指针和引用的一些事情吧

关于指针和引用一直是学习C++的同学们争论的焦点,什么时候用指针,什么时候用引用,还有怎么引用数组,这么用指针访问数组,以及初始化的问题. 不过有一些文章我在很早就已经写过,但是由于当时时间不充分,自己也都是随性写的,可以参看以前我的一个文章:http://blog.csdn.net/pbymw8iwm/article/details/8555197 这里就详细说一下: 1.关于引用和指针的初始化 首先没有空引用,一个引用必须代表某个对象,如果你有一个变量,目的用来指向领一个对象,但是它有可能不