指针初认识(一)

一、内存和地址 

      计算机的内存由数以万计的位(bit)组成,每个位可以容纳0或1。但一个位所能表示的值得范围太有限,通常许多位合成一组作为一个单位,通常由8个位构成一个单位,简称字节(byte)可以存储无符号值0~255,或有符号值-128至127。为了存储更大的值,我们把两个或者更多个字节合在一起作为一个更大的内存单位。一般以4个字节的来作为更大的内存单位,每个字可以容纳的无符号整数的范围是从0~4294967295(2的23次方减一),可以容纳的有符号整数的范围是从-2147483648(负的2的31次方)至2147483647(2的31次方减一)。尽管一个字包含了4个字节,它仍然只有一个地址。至于它的地址是它最左边那个字节还是最右边那个字节的位置,不同的机器有不同的规定。

通过以上对内存和地址的简单描述,我们只要明白以下两点就行:

1.内存中的每个位置由一个独一无二的地址标识。

2.内存中的每个位置都包含一个值。

二、地址与内容

      上边我们了解到内存中的每个位置都包含一个值,如果你记住了一个值得存储地址,你就可以根据这个地址取得这个值。但是,要记住很多数值的地址,实在是太麻烦了,所以高级语言(C/C++等)所提供的特性之一就是通过名字(即所谓的变量)而不是地址来访问内存的位置。但我们仍要谨记变量与内存位置之间的关联不是硬件所提供的,它是由编译器为我们实现的。所有这些变量给了我们一种更为方便的方法记住地址——硬件仍然是通过地址访问内存位置

三、值和类型

接下来请看下面这些变量声明:

int    a = 112,b = -1;
float  c = 3.14;
int    *d = &a;//假设a的地址为100
float  *e = &c;//假设c的地址为108

      a和b用于存储整型值,c所存储的是浮点值。可是在实际的内存表示中,c的值却是一个整数(一序列0或1的位),这些组合起来的位可以被解释为整数,也可以被理解为浮点数,这取决于他们被使用的方式。如果使用的是整型算数指令,这个值就被解释为整数,如果使用的是浮点型指令,它就是个浮点数。因而我们要清楚的认识到——不能简单地通过检查一个值得位来判断它的类型。

四、指针变量的内容

       接下来我们一起来看一下d和e的声明,他们都被声明为指针,并用其他变量的地址予以初始化。指针的初始化是用&操作符完成的,它用于产生操作数的内存地址。

       d和e的内容是地址而不是整型或浮点型数值,d的内容与a的存储地址一致,e的内容与c的存储地址一致,即d的值是100,e的值是108。值得注意的是,d和e被声明为指针并不会改变这些表达式的求值方式:一个变量的值就是分配给这个变量的内存位置所存储的数值。如果简单地认为由于d和e是指针,所以他们可以自动获得存储于100和108的值,那就错了。变量的值就是分配给该变量的内存位置所存储的数值,即使是指针变量也不例外。

五、间接访问操作符

通过一个指针访问它所指向的地址的过程称为间接访问或解引用指针。用于间接访问的操作符是单目运算符*。

      上边我们了解到,d的值是100。当我们对d使用间接访问操作符时,它表示访问内存位置100并查看那里的值。因此,*d的右值是112——位置100的内容,它的左值是位置100本身。

       指针变量的值就是一个数字,指针并不存在内建的间接访问属性,所以除非表达式中存在间接访问操作符,否则不能不能访问它所指向的位置。(即d=&a,*d=a)。

今天的分享就到这里,后边我将继续分享指针表达式及其简单应用!!!





猜你喜欢

转载自blog.csdn.net/sqrt_2/article/details/79541572