评论

收藏

[C++] c语言_Day31_08_01

编程语言 编程语言 发布于:2021-08-03 10:28 | 阅读数:231 | 评论:0

c语言_Day31_08_01
1、指针笔试题


int main()
{
int a[5] = { 1,2,3,4,5 };
int ptr = (int)(&a + 1);
printf("%d %d\n", *(a + 1), (ptr - 1));  // 2 5
return 0;
}
a表示数组首元素的地址(步长为4),&a表示数组指针(步长为20)


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);  // 0x100014
printf("%p\n", (unsigned long)p + 0x1); // 0x100001
printf("%p\n", (unsigned int)p + 0x1); // 0x100004
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\n", ptr1[-1], ptr2); // 4 2000000
return 0;
}
ptr2内存分析:
ptr2先将a的首元素地址强制类型转换为整形再加1
后再强制类型转换为整形指针,其效果为指针在原来的基础上增长1步长。
ptr2原指向内存为01 00 00 00,现ptr2指向内存为00 00 00 02


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]); //FFFFFFFC, -4
return 0;
}
p为存放4个整形元素的数组指针(步长为16字节)
地址减地址为中间元素个数
打印整数的地址值时直接打印补码


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\n", (ptr1 - 1), *(ptr2 - 1));  // 10 5
return 0;
}


int main()
{
char* a[] = { "work", "at", "alibaba" };
char** pa = a;
pa++;
printf("%s\n", pa);  // at
}
a为存放字符指针的数组,其值为首元素(work字符串指针)的地址
pa为二级指针数组,pa自增后指向a的第二个元素(at字符串指针)的地址,解引用得at字符串


char c[] = { "ENTER", "NEW", "POINT", "FIRST" };
char** cp[] = { c + 3, c + 2, c + 1, c };
char*** cpp = cp;
内存分析:
DSC0000.png
printf("%s\n", **++cpp);  // POINT
printf("%s\n", --++cpp + 3);  // ER
printf("%s\n", *cpp[-2] + 3);   // ST
printf("%s\n", cpp[-1][-1] + 1);// EW
关注下面的标签,发现更多相似文章