【C语言进阶篇】 你真的学会数组了嘛?数组笔试题万字解析(下)(二)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【C语言进阶篇】 你真的学会数组了嘛?数组笔试题万字解析(下)(二)

✅ 字符指针笔试题解析

printf(“%d\n”, sizeof( p ));

这里p是个指针变量所以指针大小的字节为 结果为 4/8

  • printf(“%d\n”, sizeof( p ));
  • 结果为 4/8

printf(“%d\n”, sizeof(p+1));

这里指针变量 p 存放的是字符串常量首元素的地址。加一传过去的就是字符串常量,第二个元素的地址。

  • 既然是地址,那么大小就是 4/8
  • printf(“%d\n”, sizeof(p+1));
  • 结果为 4/8

printf(“%d\n”, sizeof(*p));

指针变量 p 是字符串常量首元素的地址,那么解引用也就是 字符 a

  • 所以:printf(“%d\n”, sizeof(*p));
  • 结果为 1

printf(“%d\n”, sizeof(p[0]));

p[0] == *(p+0) ==*p,所以跟上题一样要计算的是字符的大小

  • 所以:printf(“%d\n”, sizeof(p[0]));
  • 结果为 1

printf(“%d\n”, sizeof(&p));

取地址 p 取出来依旧是个地址,没有什么不同的!

  • 既然是地址,那么大小就是 4/8
  • printf(“%d\n”, sizeof(&p));
  • 结果为 4/8

printf(“%d\n”, sizeof(&p+1));

取地址 &p 加一,只是跳到p指向的空间,的下一个地址。所以 (&p+1) 传过去的还是地址

  • 既然是地址,那么大小就是 4/8
  • printf(“%d\n”, sizeof(&p+1));
  • 结果为 4/8

printf(“%d\n”, sizeof(&p[0]+1));

取字符串常量的第一个地址 + 1,传过去的是字符串常量的第二个元素 b 的地址

  • 既然是地址,那么大小就是 4/8
  • printf(“%d\n”, sizeof(&p[0]+1));
  • 结果为 4/8

💭 字符指针(strlen)笔试题

char *p = "abcdef";
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p+1));
printf("%d\n", strlen(&p[0]+1));

✅ 字符指针笔试题解析

printf(“%d\n”, strlen§);

有了开头讲的关于字符指针的描述那就简单多了,字符指针 p 里存放的是字符串常量的首地址。所以传给 strlen 的也是字符串常量的首地址。

  • 所以:printf(“%d\n”, strlen( p ));
  • 结果为 6

printf(“%d\n”, strlen(p+1));

指针p加一就指向了,第二个元素的地址那么计算字符串长度就是从第二个元素开始计算的!

  • 所以:printf(“%d\n”, strlen( p ));
  • 结果为 5

printf(“%d\n”, strlen(*p));

这里还是和前面一样的错误如果对 指针变量进行解引用 那么传过去的就是 指针变量所指向的值 a

  • 所以这里程序会发生崩溃!

printf(“%d\n”, strlen(p[0]));

这里还是和前面一样的问题对指针进行下标访问,就会导致传给 strlen() 的是指针p 所指向空间的值!

  • 所以这里程序会发生崩溃!

printf(“%d\n”, strlen(&p));

这里取出的指针变量的地址,可是指针变量的地址在哪里我们并不会知道所以这里strlen计算的就是随机值!

  • 所以:printf(“%d\n”, strlen(&p));
  • 结果为 随机值

printf(“%d\n”, strlen(&p+1));

取指针变量p 地址,加一那么传过去的指针变量下一个内存单元里面的地址,而这个地址在哪里我们并不知道!

  • 所以:printf(“%d\n”, strlen(&p+1));
  • 结果为 随机值

printf(“%d\n”, strlen(&p[0]+1));

哦豁!这里就要注意了, [ ] 的优先级比 &取地址操作符优先级高。所以我们p[0]先找到常量字符串 a 这个元素在进行取地址,然后加一找到的是第二个元素的地址。

  • 所以:printf(“%d\n”, strlen(&p[0]+1));
  • 结果为 5

💭 二维数组笔试题

int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof(*(a[0]+1)));

✅二维数组笔试题解析

printf(“%d\n”,sizeof(a));

做这种题,我们都做出经验了。只需要先判断 a的类型是什么。他是数组名,又在sizeof()里面单独存在那么 ,sizeof计算的就是整个数组的大小!

  • printf(“%d\n”,sizeof(a));
  • 结果为 3*4*4 = 48

printf(“%d\n”,sizeof(a[0][0]));

这里二维数组 a[0][0] 是第一排第一列的元素值,而这个二维数组又是整形的:

  • 所以:printf(“%d\n”,sizeof(a[0][0]));
  • 结果为 4

printf(“%d\n”,sizeof(a[0]));

这里 a[0]这里是第一排数组的的数组名,又是单独出现在sizeof 里面的。而数组名单独出现在sizeof里面计算的就是整个数组的大小!

  • 所以:printf(“%d\n”,sizeof(a[0]));
  • 结果为 4*4=16

printf(“%d\n”,sizeof(a[0]+1));

a[0] 作为第一行的数组名,没有单独放在sizeof 内部,没有 &a[0] 表示数组首元素的地址,也就是 a[0][0] 的地址所以 a[0]+1 是第一行第二个元素的地址,是地址就是4/8个字节.

  • 所以:printf(“%d\n”,sizeof(a[0]+1));
  • 结果为 4/8个字节

printf(“%d\n”,sizeof(*(a[0]+1)));

而这里可以这样理解 *() == [ ] 所以(*(a[0]+1)) == a[0][1] 而这指向的就是二维数组的第一行第二个元素!

  • 而这个二位数组又是整形的
  • 所以:printf(“%d\n”,sizeof(a[0]+1));
  • 结果为 4 个字节

💬 指针练习题

好了给大家讲解了这么多的数组常考面试题,关看着博主写可没有用啊!俗话说:光听不练假把式 。那么接下来就给大家留点练习题自己练习检验检验把!

📚 代码演示:

#include <stdio.h>
int main()
{
  int a[3][4] = { 0 };
  printf("%d\n", sizeof(a + 1));
  printf("%d\n", sizeof(*(a + 1)));
  printf("%d\n", sizeof(&a[0] + 1));
  printf("%d\n", sizeof(*(&a[0] + 1)));
  printf("%d\n", sizeof(*a));
  printf("%d\n", sizeof(a[3]));
  return 0;
}

📝全篇总结

✅ 归纳:

☁️ 好了以上就是关于数组类型笔试题要考察的点全部讲解了,不知道大家对数组和数组名是不是有了新的理解呢?

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖

拜托拜托这个真的很重要!

你们的点赞就是博主更新最大的动力!

有问题可以评论或者私信呢秒回哦。


目录
相关文章
|
4月前
|
算法 Java 调度
《面试专题-----经典高频面试题收集四》解锁 Java 面试的关键:深度解析并发编程进阶篇高频经典面试题(第四篇)
《面试专题-----经典高频面试题收集四》解锁 Java 面试的关键:深度解析并发编程进阶篇高频经典面试题(第四篇)
63 0
|
2月前
|
存储 小程序 C语言
C语言数据的存储(内含百度笔试题)
C语言数据的存储(内含百度笔试题)
34 4
|
2月前
|
程序员 C语言
位操作在C语言中的解析与应用
位操作在C语言中的解析与应用
73 0
|
3月前
|
存储 C语言
C语言中static关键字的作用与用法解析
C语言中static关键字的作用与用法解析
|
4月前
|
C语言
C语言实现猜数字游戏:代码详解与函数解析
C语言实现猜数字游戏:代码详解与函数解析
|
21天前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
|
24天前
|
存储 C语言
C语言程序设计核心详解 第十章:位运算和c语言文件操作详解_文件操作函数
本文详细介绍了C语言中的位运算和文件操作。位运算包括按位与、或、异或、取反、左移和右移等六种运算符及其复合赋值运算符,每种运算符的功能和应用场景都有具体说明。文件操作部分则涵盖了文件的概念、分类、文件类型指针、文件的打开与关闭、读写操作及当前读写位置的调整等内容,提供了丰富的示例帮助理解。通过对本文的学习,读者可以全面掌握C语言中的位运算和文件处理技术。
|
24天前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。
|
1月前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
1月前
|
C语言
C语言 字符串操作函数
本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。

推荐镜像

更多
下一篇
无影云桌面