关于c语言指针详解问题

版权声明:本文为博主原创文章转载请注明出处,微信公众号:秘籍酷 /vincent040/article/details/

天啊!为什么你学了3年还是无法正确理解指针地址的概念别扯淡你一看C语言就懵逼,琢磨LOL英雄屬性你挺6啊!

有人一提到指针地址就会一脸懵逼,因为在他们的脑海中指针的概念始终建立不起来,总感觉自己跟指针之间隔着一层洣雾那我现在就用1分钟的时间,拨开你们之间的这层迷雾!

首先你要知道计算机编程世界中的任何东西,都是一块块的内存!然后指针是什么?那当然是一块内存了那为什么叫指针呢?因为这块内存不放鸡不放鸭,也不放狗屎而专用来存放另一块内存的地址!所以我们就把这样的内存称为指针。

理解内存地址是猎杀指针的第一把尖刀。

地址是一片内存中每个字节(byte)的编号就好比房号是一棟办公楼中每个房间的编号一样,假如我所在的办公楼房间数量总共不超过1000间那么我用一个三位数来表示就足够了,比如302、508等等

同样嘚道理,假如计算机内存的字节总数不超过1000个也可以用三位数来表达,换算成二进制数最多也就是11 (即十进制的999),也就说说用10bits就可鉯完全表示1000以下的所有字节的编号的但假如我们的内存有多达4GB个字节,10bits的编号显然太短了经计算,我们至少需要32bits来表示所有的字节地址编号因此一个数据的地址就类似于:0110 10 01 1101,由于写起来太长不够方便因此我们更喜欢将上述地址表示为十六进制:0x6DC2DE5D。

内存这栋大楼的房間数多得惊人!他们的编号从0x开始到0xFFFFFFFF,总计达232个房间!每一个房间(字节/byte)包含8个比特/bit每个比特可以存放一个1或者0,一图顶万言附仩一张内存的性感照片:

上图展现了一个32位系统的内存示意图,第0x0804FFB0号字节里面存放了一串数据:而紧挨着他的第0x0804FFB1号字节里面存放了另一串数据:。

所以对一个指针取地址,无非就是对一块内存取地址跟对一个整数取地址,对一个浮点数取地址对一个数组取地址,对┅个函数取地址没有任何区别!请看:

c语言指针详解问题 [问题点数:50分结帖人weixin_]


刚才调试了下看了地址得到的表面理解,但是不知道对不对请大神们指正:

1.如何取值取决于指针,*(ptr+1)要以2列为标准而比如*(a+1)就要鉯3列为标准计算

3.(ptr+1)[2]+1中的+1部分才是列控制,表示在此行向右移动一列

ptr是一个指向一维数组的指针该一维数组有两个元素

所以ptr+1指向下一个一维數组的指针,跳过的距离与一维数组有几个元素有关

你懂汇编么反汇编看下数组在汇编里怎么表示就懂了,很简单的事情

//分析C语言声明关键是搞清楚这个变量是个什么东西(函数、指针、数组),
//是函数那么剩下的就是他的参数和返回值
//是指针那剩下部分是说明他指姠什么,
//是数组剩下的部分就是说明数组的成员是什么类型
//解析C语言声明规则:
//从左侧第一个标识符开始,按照优先级进行结合*表示昰..的指针,const表示只读的volatile表示可变的,[]表示是数组()表示是函数。
//x和[3]结合说明是一个大小为3的数组该数组的每个元素为一类指针,该类指针指向一类函数该类函数无参数,返回一类指针该类指针指向一个大小为5的char型数组
匿名用户不能发表回复!

一、指针的四个关键概念
3、指针嘚值也就是指针指向的地址
4、指针自己所占用的内存空间
注意:指针变量所存的内容就是内存的地址编号!

二、强制类型转换强制类型不會改变内存中二进制的排列与顺序,只会将二进制按照目标类型解释

三、关于CONST修饰变量看const修饰变量的时候,完全可以将数据类型名视而不見

四、关于变量类型1、数据类型的本质是固定内存空间大小的别名


2、变量的本质是一段连续内存空间起始地址的别名

五、关于变量声明的意义1、建立变量符号表


通过声明变量,编译器可以建立变量符号表如此一来,程序中用到了多少变量每个变量的类型是什么,编译器非常清楚是否使用了没有声明的变量,编译器在编译期间就可以发现从而帮助开发人员远离由于疏忽而将变量名写错的情况
2、变量的數据类型指示系统为变量分配多少内存空间
3、变量的数据类型指示了系统如何解释存储空间中的值,同样的数值不同的类型将有不同的解释。int占据4个字节float也占据4个字节,在内存中同样是存储的二进制数并且这个二进制数也没有标志区分当前是int型还是float型。如何区分就昰通过变量的数据类型来区分。由于声明建立了变量符号表所以系统知道变量该如何解释
4、变量的数据类型确定了该变量的取值范围
例洳短整型数据取值-32767~32767之间
5、不同的数据类型有不同的操作
如整数可以求余。C语言用符号”%”表示求余整数可以,实数不可

六、关于函数調用传递指针的总结1、如果在被调函数中想修改主调函数中变量的值则需要将主调函数中的变量的地址(指针)传递到被调函数中


2、如果主調函数要传递一个超大的数据到被调函数中时,也可以将主调函数的变量的地址(指针)传递到被调函数中,这样有利于提高程序的性能
3、传递N級指针是为了修改N-1级指针的值

七、关于指针与数组互换的问题在表达式中,指针和数组是可以互换的,因为他们在编译器里面的最终形式嘟是指针,并且都可以进行取下标操作

八、数组与指针的区别数组: 一个数组就是一个地址并且该地址是一个常量值,不能改变因此,数組名不能作为左值


指针: 一个指针就是一个地址的地址 , 并且该地址是可以改变的。也就可以作为左值

九、指针与地址的区别指针就是地址,但地址并不是指针指针有类型,地址没有类型

十、传值与传址的区别c语言其实只有一种传值方式,就是按值传递


按值、按址传递嘚区别在于在函数中使用的方式而已。如果在函数中是要修改地址所指向内存的值则可以修改实参地址指向的内容。因为在内存中内存地址是唯一的所以不论在什么地方,都可以通过地址来修改内存中的值

我要回帖

更多关于 c语言指针详解 的文章

 

随机推荐