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。
  • 相关阅读:
    在多个游戏视图间切换实现效果
    Animator窗口视图Project视图PlayerIdleAnimation和PlayerWalkingAnimation
    Swift 1.1语言函数参数的特殊情况本地参数名外部参数名
    Delphi-网络编程-UDP聊天程序(转)
    Delphi 编程进阶
    Android自定义控件(状态提示图表) (转)
    74HC166与TPIC6A595分析(转)
    基于STM32的USB枚举过程学习笔记
    USB那点事3 -使用端口2作为custom HID的传输(转)
    STM32-USB那点事
  • 原文地址:https://www.cnblogs.com/wgang171412/p/5153892.html
Copyright © 2011-2022 走看看