程序运行的结果是什么呢?
1、
程序运行的结果是什么呢?
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;
}
解:指针加减数值n,等价于指针偏移n个单位。
数组名a等价于指向数组a首元素的一个指针指向元素1。a+1向左偏移一个单位指向元素2。
&a等价于指向整个数组的指针。ptr = (&a+1)向右偏移一个单位(单位变为整个数组)指向数组末尾。
ptr-1 《===》ptr向左偏移一个单位(int)指向元素4.
2、
程序运行的结果是什么呢?
2.
struct Test
{
int Num;
char* pcName;
short sDate;
char cha[2];
short sBa[4];
}*p;
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;
}
解:p = (struct Test*)0x100000《====》结构体指针p指向0x100000
p + 0x1 《====》指针向右偏移1个单位(单位为结构体大小20)0x100020
(unsigned long)p + 0x1 《====》将p指针强转为无符号的长整型
p+1 == 0x100001
(unsigned int*)p + 0x1 《====》将p指针强转为无符号的指针型(32位系统指针位4)
p+1 == 0x100004
程序运行的结果是什么呢?
3.
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;
}
解:int a[5][5] a 一个元素个数为5的数组。每个元素是元素个数为5并为整形的数组。
int (*p)[4] p指针指向一个元素个数为4的数组
p = a p指针指向a[0]
&p[4][2] - &a[4][2], 求指针的偏移量
&p[4][2] - &a[4][2] === -4
计算机以反码的方式储存数字
源码
1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0100
补码
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1011
反码
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1100
f f f f f f f f f f f f f f f c
程序运行的结果是什么呢?
4.
int main()
{
char* c[] = { "ENTER","NEW","POINT","FIRST" };
char** cp[] = { c + 3,c + 2,c + 1,c };
char*** cpp = cp;
printf("%s\n", **++cpp);//*cp[1] == *(c + 2) -> c[2]
printf("%s\n", *-- * ++cpp + 3);//
printf("%s\n", *cpp[-2] + 3);//*cpp[-2] + 3 == *(*(cpp-2))+3
printf("%s\n", cpp[-1][-1] + 1);//cpp[-1][-1] + 1 == *(*(cpp - 1) - 1) + 1
return 0;
}
解: