• "深入理解C语言" 指针


      本文对coolshell中的"深入理解C语言"这篇文章中提到的指针问题, 进行简要的分析.

    #include <stdio.h>
    int main(void){
        int a[5];
        printf("%x
    ", a);
        printf("%x
    ", a + 1);
        printf("%x
    ", &a);
        printf("%x
    ", &a + 1);
        return 0;
    }

      假设a的地址是:0Xbfe2e100, 而且是32位机,那么这个程序会输出什么?

      #1: 第一条printf语句应该没有问题,就是 bfe2e100

      #2: 第二条printf语句你可能会以为是bfe2e101。那就错了,a+1,编译器会编译成 a+ 1*sizeof(int),int在32位下是4字节,所以是

      加4,也就是bfe2e104【a为指向int类型数据的指针】

      #3: 第三条printf语句可能是你最头疼的,我们怎么知道a的地址?我不知道吗?可不就是bfe2e100。那岂不成了a==&a啦?这怎么可

      能?自己存自己的?也许很多人会觉得指针和数组是一回事,那么你就错了如果是 int *a,因为a是指针,所以&a是指针的地址,a和

      &a一样但是这是数组啊a[],所以&a其实是被编译成了&a[0]。

      #4: 第四条printf语句就很自然了,就是bfe2e104。还是不对,因为是&a是数组,被看成int(*)[5],所以sizeof(a)是5,也就是

      5*sizeof(int),也就是bfe2e114【&a可以理解为指向int [5]类型的指针,即a为数组类型】 

    Reference:

    深入理解C语言: http://coolshell.cn/articles/5761.html

  • 相关阅读:
    数据库系统理论概念
    SQL常用函数
    Android中几种常见的定时刷新方式
    Android Resource介绍和使用
    Android 使用Loader示例
    Android框架浅析之锁屏(Keyguard)机制原理
    Android Power Management
    Android中蓝牙的基本使用
    分组ListView使用技巧
    使用CursorLoader异步加载数据
  • 原文地址:https://www.cnblogs.com/lxw0109/p/dive-into-C.html
Copyright © 2020-2023  润新知