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(十六进制)

  • 相关阅读:
    MutationObserver 简单应用场景
    call apply bind sleep
    js 继承,Object.setPrototypeOf | Object.getPrototypeOf | Object.create class
    JSON.stringify
    javascript 与node的 event-loop
    js 不常用面试题 数组对象深度取值
    Oracle单表备份
    mybatis批量写法
    mybatis批量更新
    Python中if __name__ == '__main__':理解
  • 原文地址:https://www.cnblogs.com/AndyJee/p/5229945.html
Copyright © 2011-2022 走看看