地址与指针

下面这道题目:
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. int main(void)
  4. {
  5.     short *p = 0;
  6.     int **pp = 0;
  7.     ++p;
  8.     ++pp;
  9.     printf("%d %d\n", p, pp);
  10.     return 0;
  11. }
 
其实这道题很简单,就是“指针即变量”的理解。指针,作为引用类型不假,其实现引用的途径就是将指向的object的地址存在指针本身的地址的内存空间。有些拗口吗?一步一步的说,指针本身也是一个变量,作为变量,它自然需要占用一块内存空间,那么自然拥有一个地址。当指针指向某个object时,就是将该object的地址存在指针自身地址的那块内存中。
 
下面做出解释:
short *p = 0;p是一个short *指针变量,将其赋值为0,其实与short a = 0;没有什么区别,都是将0赋给一个变量,即将0存入该变量所占用的内存地址中。那么这时,p所在的内存处存的是0——注意,这里是p所在的内存,而非p所指向的内存。
int **pp = 0,不要被这里的指针的指针类型所迷惑,其实与上面一样,都是将0赋给变量。那么这时,pp所在的内存处存的是0。
++p;
++pp;
这里考察的是指针的算术运算。指针的加减运算,需要考虑其类型,这个同样是标准定义。为什么呢,很简单。想想数组int array[3];array本身可看作指针,array+0是第一个元素的地址,array+1是第二个元素地址,所以指针的加减运算单位是sizeof(type),type为指针所指向的类型。那么此题中,p指向的类型为short,那么sizeof(short)为2,p之前的值为0,++p,这是p的值自然为2。p的值,即指针的值,其实就是指针所在内存所存的数值。而++pp,sizeof(int*)为4——int *为指针类型,32位机为4。那么++pp后,pp的值就是4。
printf("%d %d\n", p, pp);这里%d为打印整数的十进制的值,而p,pp为指针类型,所以这里有一个类型转换,即(int)p, (int)pp。即将p和pp的值转为整数类型,而其值为2和4,转换为整数自然仍然是2和4。所以这道题的最后答案为2 4。

posted on 2016-01-23 19:53  acodewarrior  阅读(407)  评论(0编辑  收藏  举报

导航