1.如下代码中,输出的内容是什么
int main()
{int a[5] = { 1, 2, 3, 4, 5 };int* ptr = (int*)(&a + 1); printf("%d,%d", *(a + 1), *(ptr - 1));return 0;
}
&a中,a代表整个数组吗,&a + 1代表跳过一整个数组后的地址,因此ptr指向的是5后面的那个地址,ptr - 1指向的是a[4]的地址,解引用是5,a + 1代表的是a[1]的地址,解引用是2,最后的结果是2,5
2.在X86环境下,假设结构体的⼤⼩是20个字节,程序输出的结果是啥?
struct Test5 {int Num; char* pcName; short sDate; char cha[2]; short sBa[4]; }*p = (struct Test*)0x100000; int main() {printf("%p\n", p + 0x1); printf("%p\n", (unsigned long)p + 0x1); printf("%p\n", (unsigned int*)p + 0x1); return 0; }
这里创造了一个结构体,并创造了一个全局变量p,这里的p是一个指针
p+ 0x1就是+1,跳过了一整个结构体,也就是+20,不要忘记改变为十六进制
第二个将p转换为无符号长整型,整型值+1就是实际上+1
第三个是int型指针,在x86的环境下,跳过一个int指针就是+4
3.如下的代码中,输出的结果是什么
int main()
{int a[3][2] = { (0,1),(2,3),(4,5) }; int* p;p = a[0]; printf("%d", p[0]);return 0;
}
在二维数组a中,不要忘记逗号操作符,实际上,a存放的是{ {1,3}, {5,0}, {0,0} }
现在p指向了a[0]的地址,输出p[0],实际就是输出1
4.如下代码中输出的结果是什么
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]); return 0;
}
p是一个数组指针,指向的数组是4个整型元素的
指针-指针 = 指针和指针之间的元素的个数
a -- 类型是int(*) [5] p -- 类型是int (*) [4]
p[4][2] == *(*(p+4)+2)
输出的结果是FFFFFFC,-4
5.如下代码输出的是什么?
#include <stdio.h>
int main()
{int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int* ptr1 = (int*)(&aa + 1);int* ptr2 = (int*)(*(aa + 1));printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));return 0;
}
这里ptr1指向的是跳过aa后的地址,ptr2指向的是6的地址
现在我们就可以输出啦
6.如下代码输出的是什么?
#include <stdio.h>
int main()
{char *a[] = {"work","at","alibaba"}; //a是指针数组char**pa = a; pa++; printf("%s\n", *pa); //at return 0;
}
a是一个指针数组,pa指向的是a的第一个的地址
pa++后指向的是第二个的地址,最后输出at
7.如下代码输出的是什么?
int main()
{ char* c[] = { "ENTER","NEW","POINT","FIRST" }; char** cp[] = { c + 3,c + 2,c + 1,c }; char*** cpp = cp; printf("%s\n", **++cpp); //POINT printf("%s\n", *-- * ++cpp + 3); //ERprintf("%s\n", *cpp[-2] + 3); //STprintf("%s\n", cpp[-1][-1] + 1); //EWreturn 0;
}
就在本道题目中,要记住解引用后是在自己的位置进行更改