最近心情比较好,给大家分享一批刺激又烧脑的练习题^-^
练习1:
解释下面代码
(*(void(*)())0) ()
void(*signal(int, void(*)(int)))(int);1)(*(void(*)())0) ()

2)void(*signal(int, void(*)(int)))(int);

练习2:
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf("%d, %d\n", *(a + 1), *(ptr - 1));
system("pause");
return 0;
}首先应清楚,此时ptr应该指向的是a的下一个数组

因此程序的结果应该是这样的

练习3:
struct text
{
int num;
char *pcName;
short sDate;
char cha[2];
short sBa[4];
}*p;
//假设p的值为0x100000,如下表达式的值分别为多少结构体内所有元素共占空间为:4+4+2+2+8 = 20字节
结构体内所有元素的大小的和,不一定是结构体的大小,因为存在内存对齐问题(结构体的内存对齐我会在下篇博客讨论)
这里我们先假设此时结构体就是20字节
p + 0x1 = 0x____? -> p是一个结构体指针,给指针+1加的是所指向类型(结构体)的大小 --> 结果为:0x100014
(unsigned long)p + 0x1 = 0x____? -> p强转为长整型,那么p里存的就是一个整型数字 --> 结果为:0x100001
(unsigned int *)p + 0x1 = 0x____? ->p强转为一个整型指针,其所指向的类型为int --> 结果为:0x100004
练习4:
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);
system("pause");
return 0;
}分析一下

因此程序的结果应该是这样的

练习5:
int main(int argc, char *argv[])
{
int a[3][2] = { (0, 1), (2, 3), (4, 5) };
int *p;
p = a[0];
printf("%d\n", p[0]);
system("pause");
return 0;
}要注意,数组里的是()不是{},所以这里应该是逗号表达式
这里应该等价为:int a[3][2] = { 1, 3, 5, 0, 0, 0 };
因此程序的结果应该是这样的

练习6:
int main(int argc, char *argv[])
{
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]);
system("pause");
return 0;
}分析一下

因此程序的结果应该是这样的

练习7:
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));
system("pause");
return 0;
}这两个指针的指向是这样的

因此程序的结果应该是这样的

练习8:
int main()
{
char *a[] = { "work", "at", "alibaba" };
char **pa = a;
pa++;
printf("%s\n", *pa);
system("pause");
return 0;
}a是一个指针数组,pa是一个指向指针的指针
因此程序的结果应该是这样的

练习9:
int main()
{
char *c[] = { "ENTER", "NEW", "POINT", "FIRST" };
char **cp[] = { c + 3, c + 2, c + 1, c };
char ***cpp = cp;
printf("%s\n", **++cpp);
printf("%s\n", *--*++cpp + 3);
printf("%s\n", *cpp[-2] + 3);
printf("%s\n", cpp[-1][-1] + 1);
system("pause");
return 0;
}定义变量之后是这样的:

1)**++cpp

2)*--*++cpp + 3

3)*cpp[-2] + 3

4)cpp[-1][-1] + 1

因此程序的结果应该是这样的

本文精选了一系列C语言中的指针与数组题目,包括指针运算、数组访问等核心概念,通过实例帮助读者深入理解并掌握这些知识点。
616

被折叠的 条评论
为什么被折叠?



