1.C指针

1.指针基本介绍

要理解指针,首先需要理解不同的数据类型或不同的变量在计算机的内存中是如何存储的。

假设下面的这张图,表示的是计算机的内存,当我们在谈论程序执行的时候,计算机内存大部分时候指的是随机存储器也就是RAM,我们经常说我的机器有2GB或者说2G字节的RAM或者4G字节的RAM,现在,假设你所看到的这些段或者区它们在内存中都代表一个字节。

 

 作为典型的计算机架构,一个典型的内存系统,其中的每一个字节都有一个地址。因此,假设内存中的第一个地址在最下面,它的地址是0,然后地址向上增长,地址会想0,1,2,...那样增长。

现在,我们在程序中声明一个变量,比如 int a;,计算机会为这个特定的变量分配一些内存空间,具体分配多大,取决于数据类型和编译器;通常典型的编译器整型变量会分配4bytes,字符型变量1byte, float 4bytes;计算机会有一个内部的结构,一张查找表,保存着变量'a'的信息,比如:

 

 比如变量a是整型,然后它的地址是204,也就是变量的起始地址;如果我们声明另外一个变量,比如一个字符型变量char c; 也是一样,机器看到这个声明,就知道这是个字符型的变量,因此需要1个字节的内存,那么它会去找空闲的内存空间,比如上面的209这个地址,然后在内部的结构中,为这个变量保留了一个条目,也就是查找表中多了一条记录;

现在,我们再继续对变量进行操作,比如进行初始化:a=5,计算机看到这样的语句,它会去查找这个变量'a',找到这个'a',知道它是一个整型,地址是在204,它就跑到204这个地址,从204开始,向这个4个字节,写入5这个值,当然这个值是使用二进制的形式写入的;

 

 

接下来我们有另外一条语句来自增变量,a++,计算机看到后,'a'需要自增,就去查'a'的地址,跑到这个地址,然后修改这个地址中存放的值,所以现在代表'a'的这块内存中,存放的值就是6了;

 

看起来一切都没问题,那么在程序中,我们能否得知一个变量的地址呢?当然可以,你可以在c或c++中使用指针;指针是一个变量,它存放着另外一个变量的地址;

 现在有一块4字节的内存,从204的位置开始存放着整型变量'a',那么现在可以有另一个变量'p',它的类型是指向整型的指针,变量'p'可以存放变量'a'的地址,然后我们可以利用'p'的属性,或者说通过对变量'p'进行一些操作,我们可以访问'a';

而且作为变量的'p'也有一个地址,比如是64,它同样需要占据4个字节,我们也可以修改变量'p'使它指向其他的整型变量,这里我们假设,有另外一个变量'b',它在内存中的地址是208, 里面的值是10,我们可以把‘p’里面的内容从204改成208,那么'p'就会指向变量'b';

 指针变量的语法:int *p;  这里'p'是一个可以存放整型变量的地址的变量,为了在'p'中存放'a'的地址,可以这样:p = &a;   这里的 & 是取地址符,可以得到变量的地址,该符号返回一个指针,指向符号作用的变量。我们此时初始化a,那么'a'里面就是5了,通过地址'p'可以得到a的值,如果我们把一个 * 放在指针变量的前面,就可以得到这个指针所指向地址的值:cout << *p;打印得到的就是a的值5 ,*p 这个概念叫解引用,我们利用解引用操作来取得特定地址的值;

 

除此之外,我们还可以修改这个特定位置的值,比如,如果我们对*p进行赋值:*p=8,那么现在,'p'所指向的值就改成了8,那么现在打印'p'或者'a'得到的结果就会是8;

p是一个指针变量,它是一个地址;*p则是一个值,这个值就是'p'里面存放着的那个地址所指向的内存的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值