问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

...中指针&*a与*&a的区别,用直白点的话解释,书上的理解不了

发布网友 发布时间:2024-09-26 10:14

我来回答

1个回答

热心网友 时间:2024-10-04 06:33

你问的这个话题太大。关于指针和引用要讲的东西很多。我的理解:指针:其实指针这个概念在谭浩强的这本书上是这样说的,指针就是地址,指针值就是地址值。指针变量就是存放指针的变量,所以一定不要将指针与指针变量搞混淆了。指针仅仅是一个地址值,而指针变量就是存放指针(也就是地址的变量)指针的定义:例如整型指针:int*p;p是一个指向int类型数据的指针变量。里面存放的地址(也就是指针)是一个int类型变量的地址。指针变量时有类型的,例如p的类型就是int*表示p是一个指向int类型的指针变量。如何知道一个指针变量的类型呢,最简单的方法就是去掉变量定义语句中的变量名,剩下的部分就是其类型,这种方法适用于所有的变量定义,例如inta;a的类型是int。intb[10];b的类型是int[]表示是一个数组(关于数组类型这里不谈,因为这个问题很微妙,其实在c、c++中没有数组类型这个概念,包括函数类型也是一样的),int*c;c的类型是int*。int**d;d的类型就是int**;所以通过这种方法来判断一个变量的类型是很方便的。说道指针变量,我们必须说到得有几个方面。1.指针类型。这个很重要,一个指针是有类型的,也就是一个地址是有类型的。具体说是某一个地址会指向不同类型的数据,这是不一样的,例如int*p;p是指向int型数据。double*p1;p1是指向double型数据。但是p和p1本身在内存中占用的空间是4个字节(对于32位的系统来说),如果是在TC中编译c程序,应该是2个字节了(dos操作系统是16位的)。有人说地址不就是一个值吗,类似于0xfffdddcc这样的地址数值,为什么还分什么类型呢,我要说的是这个关系很大。我们知道指针是有运算的,int*p=&a;那么p++到底加了多少呢,不要以为是将p里面的地址值加了1,这是完全想当然。实际上加了sizeof(int)这么多个字节。也就是说加了一个int元素应该占用的字节,这样在数组中我们可以通过这种方式从上一个元素很方便的让指针变量指向下一个元素。p+5的话实际上是加了p+sizeof(int)*5这么多个字节。另外一点事指针的类型决定了当指针解引用的时候其所以指向的内存单元中的二进制数据如何解释的问题。例如int*p=&a;那么(*p)取得的数字就是一个整型数据,如果(*((char*)p))得到的就是一个字符型数据了。p本来指向的是int型数据(有4个字节)的首地址,如果将其强制转换为一个指向char类型的指针变量,那么在解引用的时候只取第一个字节的数据,并将其解释为一个ascii码代表的字符。还有如果是一个指向函数的指针变量,我们可以通过此指针变量直接调用函数。例如int(*function)(int);此时function指向一个函数,此函数具有一个int参数,返回一个int值。那么通过指针可以这样调用该类型的函数了inta=function(100);或者inta=(*function)(100);其实要不要解引用都是可以的。不过以前是需要解引用的,现在c标准规定这两种方法都可以。总的来说指针的类型很重要。2.指针与数组。我们向一个函数传递数组的时候一般是传递数组名,我们知道数组名是一个代表数组中第一个元素的地址并且数组名是不可以当左值的。其实你又没有想过数组名到底是什么呢。有人说其实数组名就是一个指针常量,是一个不可以改变的指针常量。例如:inta[10]={1,2,3,4,5,6,7,8,9,10};那么a可能的类型是int*consta;注意const的位置(关于指针常量和常量指针,这个以后说),那么这种说法到底对不对呢。我们可以通过sizeof运算符来计算某一种数据类型占用的存储空间。例如sizeof(10)的值为4,注意这里我都假设在32位的操作系统上面编译。其实sizeof(10)和sizeof(int)是一样的,仅仅是求这种类型的数据占用多少内存空间,而不是说具体的某个数据占用的空间,因为对于10这个文字常量来说根本不会占用内存空间的,其实随着程序直接编码到源程序中的,不存在分配内存的问题。那么我们这样计算sizeof(a);是不是如我们所愿得到的是4呢。结果可能会有意外,因为其值是sizeof(int)*10也就是40个字节,显然这个字节数是整个数组占用的字节数。而不是int*类型的指针变量占用的字节数,我们知道一个地址只占用4个字节那么这说明数组名绝对不是简单的int*类型。但是数组确实具有int*的特性。例如int*p=a;这是不会报错的。而且在函数之间传递的时候也是采用这样的方式:voidprint(intb[10]){}调用函数:print(a);或者:print(&a[0]);都是一样的。注意在某一个函数内对形参进行sizeof:voidprint(intc[100]){sizeof(c);//此时表达式的结果是4,而不是100。因为这里intc[100]与int*c是一样的,c不是数组名(数组名是不能作为左值的)}3.指针与函数一个指针可以指向一个函数,指针可以作为函数参数,函数可以返回一个指针类型的数据。指向函数的指针:指向函数的指针,实际上此指针就是函数代码的入口地址。我们可以通过这样的方式调用函数。例如:voidprint1(intx){cout<<"hello"<
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
初中英语语法讲解:名词所有格 关于名词所有格一问 暗区突围画面怎么设置最好-暗区突围画面设置推荐 暗区突围打开的箱子怎么关上 保险箱关闭攻略 暗区突围 暗区突围画面设置怎么弄最佳? 暗区突围 暗区突围光影怎么调? 暗区突围 暗区突围中间白点怎么设置? 暗区突围灵敏度怎么调最稳 暗区突围灵敏度最佳设置方法 我的WIN7 64位系统无法安装打印机HP1136,请支持啊,急。驱动下载也没用... win7电脑连接不上惠普打印机Win7系统安装不了惠普HP1007打印机 求解塔罗牌之"正义”在感情牌阵中的含义 请求有经验的塔罗师帮助_百度... 塔罗心理测试:出门被滴到鸟屎作何想法?测你此生会被什么牵绊_百度... 大象吃草为什么可以长那么大 CHS412焊条如何提高其耐蚀性和耐热性? 华琰俩字草书和行书怎么写? 哪个铁路招人 请问最近有谁收到了中国铁路工程总公司邀请函,还通知要异地实习的,有没... 我是外省的,面对新同学只能用普通话交流,感觉没办法融入集体里,好孤单... ...从小说河南话,现在说普通话有些说的不好,在同学面前有些尴尬,请问... ...都在说方言,听不懂。只有跟我说话时才说普通话,让我很是苦恼。_百度... 小学时说普通话,会说家乡话但敢不说,到了初中也这样,被同学误解为我不... 为什么我的电脑关机时总是会自动重启? ...六点关闭,为什么每天都是五点就自动关闭了? 手机WIFI总是自动打开自动关闭很烦人的这是怎么回事 ...运营商被我不小心关闭了,总是显示正在搜索,怎么才能... ...打开还是关上我记不清了,然后再进去运营商选项就不见了_百度... ...用的文泰软件怎么总是用了不到一分钟就会自动关闭,弹出 魔域血魂超杀是什么属性?有什么用? ...设计调试工作,已工作8年能否报考注册电气工程师? 怎么在轻松筹发起众筹? 08款宝来经典能改装四眼尾灯吗 ...平时也不太喜欢说话,每次我到一个新环境里(如:工厂上班)心里就很... 当你进入到一个新的集体时,你是什么样子的? 清华大学的双学位有哪些? 怎样写好毕业论文致谢? 哪些大学有对外双学位 什么是双学位怎么获得 猪耳朵和什么炒好吃 我是什么星座?是什么血型?拜托了 我是十一月二十六曰过生曰那我是什么血型和属性星座是什么 功放电路中电容和电阻的作用是什么? 我不知道自己的血型,还有星座,怎么办啊? 新乐美苑新城属于哪个社区 戌年长是什么意思? 戌时是几点到几点戌时是属于什么生肖 戊戌是哪个生肖 你好请问一下,联通民乐宽带,我只有电视,没有电脑,想看卫视直播节目,怎 ... 农夫山泉最新的广告语是什么? 10.1寸是多大? 穿越成宜妃的妹妹的小说