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

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

👁️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进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
|
4天前
|
C++ 存储 Java
C++ 引用和指针:内存地址、创建方法及应用解析
'markdown'C++ 中的引用是现有变量的别名,用 `&` 创建。例如:`string &meal = food;`。指针通过 `&` 获取变量内存地址,用 `*` 创建。指针变量存储地址,如 `string *ptr = &food;`。引用不可为空且不可变,指针可为空且可变,适用于动态内存和复杂数据结构。两者在函数参数传递和效率提升方面各有优势。 ```
|
5天前
|
存储 搜索推荐 编译器
C语言数组深入解析与实战应用
C语言数组深入解析与实战应用
12 0
|
5天前
|
存储 算法 Java
Java数组与集合的深入解析
Java数组与集合的深入解析
23 0
|
6天前
|
C++
多重指针:深入解析、应用与示例
多重指针:深入解析、应用与示例
|
6天前
|
C++
野指针与空指针:深入解析与防范策略
野指针与空指针:深入解析与防范策略
|
6天前
|
存储 C语言
字符指针变量与字符数组的比较
字符指针变量与字符数组的比较
17 3
|
6天前
|
存储 C语言
指针数组作为main函数的形参
指针数组作为main函数的形参
4 0
|
6天前
|
存储 C语言 索引
指向结构体数组的指针
指向结构体数组的指针
11 0
|
6天前
|
C语言
在引用数组元素时指针的运算
在引用数组元素时指针的运算
12 0

推荐镜像

更多