zoukankan      html  css  js  c++  java
  • 易出错的C语言题目之二:指针

    一、写出输出结果

    #include<stdio.h>
    
    int main(){
        int a[3];
        a[0] = 0;
        a[1] = 1;
        a[2] = 2;
    
        int *p,*q;
        p = a;
        q = &a[2];
    
        int c = a[q-p];
    
        printf("value c = %d/n",c++);
        printf("value c = %d/n",c);
    
        return 0;
    }

    答案:

    value c = 2/nvalue c = 3/n

    解析:

    此处q-p=2,容易错,地址相减得除以类型,表面上差了8,实际上差了2。不同类型的地址,比如char *p,额int *p,p-q不能操作,报错。

    二、写出下列函数运行结果

    #include<stdio.h>
    
    int main(){
        int a[5] = {1,2,3,4,5};
        int *ptr = (int*)(&a+1);
    
        printf("%d,%d",*(a+1),*(ptr-1));
        return 0;
    }

    答案:

    2,5

    解析:

    a表示数组首元素地址,即&a[0],该地址偏移大小为sizeof(int),而&a表示结构体的地址,该地址偏移大小为sizeof(a),即5*sizeof(int),a的类型为(int*)[5]

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

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

    答案:

    0Xbfe2e100

    0Xbfe2e104

    0Xbfe2e100

    0Xbfe2e114

    解析:

    a表示数组首元素地址,即&a[0],该地址偏移大小为sizeof(int),因此a+1地址为0Xbfe2e100+sizeof(int) = 0Xbfe2e104;

    而&a表示结构体的地址,该地址偏移大小为sizeof(a),即5*sizeof(int),a的类型为(int*)[5],因此&a+1地址为0Xbfe2e100 + 5*sizeof(int) = 0Xbfe2e114(十六进制)

  • 相关阅读:
    How to Compile Java DBus
    BZOJ 2783 JLOI 2012 树 乘+二分法
    Robotium原则的实施源代码分析
    基本的负载均衡算法
    人大、上财、复旦、上交四校2013年应届金融硕士就业去向
    2014届上财金融硕士就业情况
    三跨),总分420+
    复旦金融专硕和上财金融专硕
    一个三跨考生三战上海财经大学金融硕士的考研经验
    董某某
  • 原文地址:https://www.cnblogs.com/AndyJee/p/5229945.html
Copyright © 2011-2022 走看看