zoukankan      html  css  js  c++  java
  • 地址与指针

    下面这道题目:
    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 ", 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 ", p, pp);这里%d为打印整数的十进制的值,而p,pp为指针类型,所以这里有一个类型转换,即(int)p, (int)pp。即将p和pp的值转为整数类型,而其值为2和4,转换为整数自然仍然是2和4。所以这道题的最后答案为2 4。
  • 相关阅读:
    (Java随机数举例)随机扔一千次硬币的正反次数
    hibernate+spring的整合思路加实例(配图解)
    从零开始学C++之IO流类库(三):文件的读写、二进制文件的读写、文件随机读写
    ssh连接Linux自动断开后再也无法连上的问题
    面试题10:二进制中1的个数
    C 语言统计关键字出现次数
    在Eclipse中Attach Source
    Visual Sudio 2012转换界面风格
    java 判断字符串IP合法性以及获取IP的数值形式
    java.lang.string split 以点分割字符串无法正常拆分字符串
  • 原文地址:https://www.cnblogs.com/wgang171412/p/5153892.html
Copyright © 2011-2022 走看看