笔试题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; } //程序的结果是什么?
代码结果:
图片讲解:
笔试题2
//这里告知结构体的大小是20个字节 struct Test { int Num; char* pcName; short sDate; char cha[2]; short sBa[4]; }*p; //假设p 的值为0x100000。 如下表表达式的值分别为多少? //已知,结构体Test类型的变量大小是20个字节 int main() { printf("%p\n", p + 0x1); printf("%p\n", (unsigned long)p + 0x1); printf("%p\n", (unsigned int*)p + 0x1); return 0; }
代码结果:
详细讲解:
struct Test { int Num; char* pcName; short sDate; char cha[2]; short sBa[4]; }*p; //假设p 的值为0x100000。 如下表表达式的值分别为多少? //已知,结构体Test类型的变量大小是20个字节 int main() { p = (struct Test*)0x100000; printf("%p\n", p + 0x1); printf("%p\n", (unsigned long)p + 0x1);//这里指的是整型加1 printf("%p\n", (unsigned int*)p + 0x1);//这里指的是指针加1 return 0; }
图片讲解:
笔试题3
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; }
代码结果:
详细讲解:
a为首元素地址,假设a的地址是0x0012ff40,(int)a强制类型转换为整型,整型加1,变成0x0012ff41
图片讲解:
a为首元素地址,假设a的地址是0x0012ff40,(int)a强制类型转换为整型,整型加1,变成0x0012ff41
笔试题4
int main() { int a[3][2] = { (0, 1), (2, 3), (4, 5) }; int* p; p = a[0]; printf("%d", p[0]); return 0; }
代码结果:
详细讲解:
int main() { int a[3][2] = { (0, 1), (2, 3), (4, 5) };//该为逗号表达式 //int a[3][2] = { {0, 1}, {2, 3}, {4, 5} };//这才是真正数组的情况 int* p; p = a[0]; printf("%d", p[0]); //a[0]是二维数组第一行的数组名 //对a[0]这个数组名没有&,没有单独sizeof //所有a[0]这个数组名表示数组首元素的地址,即a[0][0]的地址 //a[0]----->&a[0][0] //p[0]----->*(p+0)--*p return 0; }
a[ 0 ]是二维数组第一行的数组名
对a[ 0 ]这个数组名没有&,没有单独sizeof
所有a[ 0 ]这个数组名表示数组首元素的地址,即a[ 0 ][ 0 ]的地址
a [ 0 ]----->&a[ 0 ][ 0 ]
p[ 0 ]----->*(p+0)–*p
图片讲解: