指针和数组笔试题解析【下篇】

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 指针和数组笔试题解析【下篇】

👁️6.指针笔试题

👀6.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;
}

c28d9e77b94c4797a00eac30cdf7812d.png

3ccedd9982e044ba9b03bf5994a32e7f.png


👀6.2.试题(2)

💡假设p的值为0x100000 如下表达式的值分别为多少?

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);
  printf("%p\n", (unsigned int*)p + 0x1);
  return 0;
}

🔴(1)这里因为 p 是结构体类型+1,+1跳过20个字节,因此结果为0x100014(十六进制)

🔴(2)这里 p 被强制类型转换为整型,所以 p+1 就是整型+1,因此结果为0x100001

🔴(3)这里 p 被强制类型转换为整型指针,所以 p+1 跳过4个字节,因此结果为0x100004

13a96039262947248d7e0ff7184eca1c.png

👀6.3.试题(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;
}

17f751d61eb642b284cd3d440075fc4c.png

👀6.4.试题(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 a[3][2] = { {0,1},{2,3},{4,5} };

而这道题考察的是逗号表达式,里面不是 {} 而是 ()

672fad79940c4ca4a596efa205146eff.png🔴a[0] 是二维数组第一行的数组名

🔴对 a[0] 这个数组名没有&,也没有单独的sizeof

🔴所以 a[0] 这个数组名表示数组首元素地址,即 a[0][0] 的地址

🔴a[0] —> &a[0][0]

🔴p[0] —> * (p+0) —>* p

f4d39766fec14935b96f97433d97eeaf.png


👀6.5.试题(5)

💡下面代码输出的结果是什么?

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;
}

a5321c89e27c4e32a4a3af7ad092c554.png

🔴-4
10000000000000000000000000000100 -- 原码
11111111111111111111111111111011 -- 反码
11111111111111111111111111111100 -- 补码
0x FF FF FF FC

31681b35653f4e3389944d203570461e.png

👀6.6.试题(6)

💡下面代码输出的结果是什么?

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;
}

🔴根据以上几道题可以自己思考一下,这道题比较简单🥰

0f27306281ba49f0b544d09f92e9f82a.png

👀6.7.试题(7)

💡下面代码输出的结果是什么?

int main()
{
  char* a[] = { "work","at","alibaba" };
  char** pa = a;
  pa++;
  printf("%s\n", *pa);
  return 0;
}

11543da99d3d47b8b59b75afb096e7c6.png

8fa6ebffcc81478e9e109330bc905dc6.png

👀6.8.试题(8)

💡下面代码输出的结果是什么?

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);
  return 0;
}

8cd56cb042d84f7da79d525526169383.png

d0b314dade1f45aeb6ea1e164ff40799.png

0c7effe58ea040af9341d83172c1d51f.png🔴这道题比较有难度,如果这道题可以完全理解,那么说明对于指针的学习还是不错的🥳

🔴一定要自己独立画图理解‼️

🥰今天的内容比较有难度,希望烙铁们能够理解欧‼️🥰

目录
相关文章
|
6天前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
18 3
|
5天前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
12 2
|
14天前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
23 1
|
23天前
|
人工智能 前端开发 JavaScript
拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
|
23天前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
23天前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。
|
23天前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
29天前
魔法指针 之 二级指针 指针数组
魔法指针 之 二级指针 指针数组
16 1
|
1月前
|
存储
一篇文章了解区分指针数组,数组指针,函数指针,链表。
一篇文章了解区分指针数组,数组指针,函数指针,链表。
17 0

推荐镜像

更多
下一篇
无影云桌面