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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 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🔴这道题比较有难度,如果这道题可以完全理解,那么说明对于指针的学习还是不错的🥳

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

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

目录
相关文章
|
2月前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
113 1
|
3月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
3月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
3月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
3月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
3月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
81 4
|
3月前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
63 2
|
3月前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
53 3
|
3月前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
51 1
|
3月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
276 13

推荐镜像

更多