易出錯的C語言題目之二:指針

1、寫出輸出結果

#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;
}

答案:c++

value c = 2/nvalue c = 3/n數組

解析:函數

此處q-p=2,容易錯,地址相減得除以類型,表面上差了8,實際上差了2。不一樣類型的地址,好比char *p,額int *p,p-q不能操做,報錯。spa

2、寫出下列函數運行結果

#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;
}

答案:code

2,5blog

解析:io

a表示數組首元素地址,即&a[0],該地址偏移大小爲sizeof(int),而&a表示結構體的地址,該地址偏移大小爲sizeof(a),即5*sizeof(int),a的類型爲(int*)[5]class

3、假如咱們的a的地址是:0Xbfe2e100, 並且是32位機,那麼這個程序會輸出什麼?

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

答案:程序

0Xbfe2e100di

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

相關文章
相關標籤/搜索