指针习题

第一题:

求以下输出结果

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

输入结果
指针习题

第二题:

struct Test {
    int Num;
    char* pcName;
    short sDate;
    char cha[2];
    short sBa[4];
}*p;
//假设p的值为Ox100000,如下表表达式的值分别是多少?
//已知,结构体Test类型的变量大小是20个字节
int main() {
  p = (struct Test*)0x100000;
    printf("%p\n", p + 0x1);
    printf("%p\n", (unsigned long)p + 0x1);
    printf("%p\n", (unsigned int*)p + 0x1);
    return 0;
}

输出结果

指针习题

解析
指针习题

指针加减整数的运算,取决于指针类型。

第三题:

int main() {
    int a[4] = { 1,2,3,4 };
    int *ptr1 = (int *)(&a + 1);
    int *ptr2 = (int*)((int)a + 1);
    printf("%x,%x", ptr1[-1], *ptr2);
    return 0;
}

输出结果
指针习题
16进制前面的0可以省略
解析

指针习题

第四题:

int main() {
    int a[5][5];
    int(*p)[4];
    p = a;
    printf("%p%d\n", &p[4][2] - &a[4][2], &p[4][2].&a[4][2]);
}

输入结果:
指针习题

解析:

指针习题

第五题:


int main() {
    int a[3][2] = { (0,1),(2,3),(4,5) };
    int *p;
    p = a[0];
    printf("%d", p[0]);
    return 0;
}

输出结果:

指针习题

注意 :二维数组中是逗号表达式,所以a[3][2]={1,3,5}.

上一篇:题添加标题可以增加可移植性? (SYS / time.h中)


下一篇:[Android逆向]超级录屏 4.3.1.8_rel 高级版解锁