指针和数组面试题(逐题分析,完善你可能遗漏的知识)
人生不是一种享乐,而是一桩十分沉重的工作。 —— 列夫·托尔斯泰
前言:之前我们就学习了数组和指针的知识。
数组:数组就是能够存放一组相同类型的元素,数组的大小取决于数组的元素个数和元素类型。
指针:指针就是存放地址的变量,称为指针变量。大小是4/8个字节(32位平台/64位平台)。
而数组和指针有什么联系呢?
数组名是首元素的地址,而地址存放在指针变量中,我们就可以使用指针变量来遍历数组。
而数组名是首元素的地址有两个特例:
1.如果数组名放在sizeof内部,也就是sizeof(数组名),这里的数组名表示整个数组,sizeof求的也就是整个数组的字节大小。
2.&数组名,取出的是整个数组的地址。
这里我们所用的是32位的平台,所以指针的大小都是4个字节。
接下来的题我们会用到sizeof操作符和strlen函数。
细节:
1.sizeof计算的是占用内存空间的大小,单位是字节,不关注内存中到存放的是什么。
2.sizeof不是函数,是操作符。
3.strlen是函数,所用的头文件是#include<string.h>。
4.strlen是针对字符串的,求的是字符串长度,本质上统计的是/0之前出现的字符的个数。
5.strlen的参数是char*类型的,即指针。
第一类题:
int main()
{int a[] = { 1,2,3,4 };//数组的大小是4printf("%d\n", sizeof(a));//16个字节//a单独放在sizeof内部,表示整个数组,所以sizeof求的整个数组大小16字节printf("%d\n", sizeof(a + 0));//4个字节//a没有单独放在sizeof内部,也没有&,所以数组名表示数组首元素的地址//加0也是首元素的地址,也就是指针,大小是4printf("%d\n", sizeof(*a));//4个字节//a表示首元素地址,也就是&arr[0],*a也就是a[0],第一个元素的大小printf("%d\n", sizeof(a + 1));//4个字节//a表示首元素的地址,a+1表示第二个的地址,即指针大小printf("%d\n", sizeof(&a));//4个字节//&a表示取出整个数组的地址,但是还是地址,即指针的大小printf("%d\n", sizeof(*&a));//16个字节//*和&相当于抵消了,也就是表示sizeof(a),代表整个数组的大小printf("%d\n", sizeof(&a + 1));//4个字节//&a表示取出整个数组的地址,&a+1,跳过整个数组,但是还是地址,即指针的大小printf("%d\n", sizeof(&a[0]));//4个字节//取出第一个元素的地址,即指针的大小printf("%d\n", sizeof(&a[0] + 1));//4个字节//第二个元素的地址,即指针的大小return 0;
}
第二类题:
int main()
{char arr[] = { 'a','b','c','d','e','f' };printf("%d\n",sizeof(arr));//6个字节//arr单独放在sizeof内部,表示整个数组的大小printf("%d\n",sizeof(arr+0));//4个字节//arr表示数组首元素的地址,arr+0也是首元素地址,即指针大小printf("%d\n",sizeof(*arr));//1个字节//arr表示数组首元素的地址,&arr即arr[0]printf("%d\n",sizeof(arr[1]));//1个字节//表示第二个元素bprintf("%d\n",sizeof(&arr));//4个字节//&arr取出的是整个数组地址printf("%d\n",sizeof(&arr+1));//4个字节//&arr取出整个数组地址,&arr+1,跳过整个数组,但还是地址,即指针的大小printf("%d\n",sizeof(&arr[0]+1));//4个字节//&arr[0]取出的是第一个数的地址,&arr[0]+1即第二个数的地址,即指针return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{char arr[]= { 'a','b','c','d','e','f' };printf("%d\n",strlen(arr));//随机值//arr表示首元素的地址,strlen求得是首元素地址后面的字符个数//但是字符串没有\0存在,所以大小是随机值printf("%d\n",strlen(arr+0));//随机值//一样的是首元素的地址,求出的是随机值printf("%d\n",strlen(*arr));//error//*arr表示arr[0],即代表字符a,不是地址,代码错误printf("%d\n",strlen(arr[1]));//error//一样的不是地址,代码错误printf("%d\n",strlen(&arr));//随机值//&arr取出整个数组的地址,但是遇不到\0,大小是随机值printf("%d\n",strlen(&arr+1));//随机值-6//&arr+1跳过整个数组,得到的值是上面随机值-6printf("%d\n",strlen(&arr[0]+1));//随机值-1//&arr[0]+1代表第二个元素得地址,得到的值是上面随机值-1return 0;
}
printf("%d\n",strlen(*arr));//error//*arr表示arr[0],即代表字符a,不是地址,代码错误printf("%d\n",strlen(arr[1]));//error//一样的不是地址,代码错误
出现这两种,strlen里面不是地址,编译器编译就会出现下面一样的错误:
第三类题:
int main()
{char arr[] = "abcdef";//字符串末尾还隐藏了一个\0,所以数组大小为7printf("%d\n",sizeof(arr));//7个字节//arr单独放在sizeof内部,表示整个数组,大小为7printf("%d\n",sizeof(arr+0));//4个字节//arr表示首元素的地址,加0也是一样,即指针printf("%d\n",sizeof(*arr));//1个字节//arr表示&arr[0],*arr表示arr[0],大小是1printf("%d\n",sizeof(arr[1]));//1个字节printf("%d\n",sizeof(&arr));//4个字节//&arr取出整个数组的地址,但是还是地址,即指针printf("%d\n",sizeof(&arr+1));//4个字节//&arr+1跳过整个数组的地址,但还是地址,即指针printf("%d\n",sizeof(&arr[0]+1));//4个字节//表示第二个元素的地址return 0;
}
int main()
{char arr[] = "abcdef";printf("%d\n",strlen(arr));//大小是6//arr表示首元素的地址,求得是首元素到\0一共多少个字符printf("%d\n",strlen(arr+0));//大小是6printf("%d\n",strlen(*arr));//error//*arr表示arr[0]printf("%d\n",strlen(arr[1]));//errorprintf("%d\n", strlen(&arr));//大小是6//&arr整个数组的地址,但数值还是首元素的地址printf("%d\n", strlen(&arr+1));//大小是随机值//&arr+1表示跳过整个数组printf("%d\n", strlen(&arr[0]+1));//大小是5//表示第二个元素的地址return 0;
}
第四类题:
char* p = "abcdef";
不代表是,但可以理解为:
char arr[]="abcdef";
char*p=arr;
int main()
{char* p = "abcdef";//p表示首元素的地址//char arr[]="abcdef";//char* p = arr;printf("%d\n", sizeof(p));//4个字节//p是指针,大小是4printf("%d\n", sizeof(p+1));//4个字节 //p+1表示第二个元素b的地址,即指针printf("%d\n", sizeof(*p));//1个字节//p表示&arr[0],*p即arr[0],大小是1printf("%d\n", sizeof(p[0]));//1个字节//相当于arr[0],即第一元素printf("%d\n", sizeof(&p));//4个字节//&p表示取出一级指针的地址,跟字符串没关系,但是还是指针printf("%d\n", sizeof(&p+1));//4个字节//跳过一级指针p的全部地址printf("%d\n", sizeof(&p[0]+1));//4个字节//&p[0]相当于&arr[0],加1表示第二个元素的地址return 0;
}
int main()
{char* p = "abcedf";printf("%d\n", strlen(p));//大小是6//p代表首元素的地址printf("%d\n", strlen(p + 1));//大小是5//p+1代表第二个元素的地址printf("%d\n", strlen(*p));//error//p表示&arr[0],*p着代表arr[0]printf("%d\n", strlen(p[0]));//errorprintf("%d\n", strlen(&p));//随机值//取出的是p的地址,跟字符串无关printf("%d\n", strlen(&p + 1));//随机值printf("%d\n", strlen(&p[0] + 1));//大小是5//代表第二个元素的地址return 0;
}
第五类题:
二维数组:
int main()
{int a[3][4] = { 0 };printf("%d\n", sizeof(a));//48个字节//a单独放在sizeof内部表示整个数组的大小printf("%d\n", sizeof(a[0][0]));//4个字节//表示第一个元素的大小printf("%d\n", sizeof(a[0]));//16字节//a[0]表示第一行的数组名。单独放在sizeof内部,即第一行的大小printf("%d\n", sizeof(a[0]+1));//4个字节//a[0]表示第一行的数组名,即数组首元素的地址,a[0]+1表示第一行第二个数的地址printf("%d\n", sizeof(*(a[0]+1)));//4个字节//代表第一行第二个数printf("%d\n", sizeof(a+1));//4个字节//二维数组的数组名首元素的地址,即表示第一行的地址printf("%d\n", sizeof(*(a+1)));//16个字节//第一行的四个数的大小printf("%d\n", sizeof(&a[0]+1));//4个字节//&a[0]代表取出第一行的地址,加1即第二行的地址printf("%d\n", sizeof(*a));//16个字节//a表示第一行的地址,*a即第一行的四个数printf("%d\n", sizeof(a[3]));//16个字节//感觉a[3]已经数组越界了,但是sizeof内部的值不会进行计算return 0;
}
第六类题:
struct test
{int num;//4个字节char* name;//4个字节short date;//2个字节char ch[2];//2个字节short p[4];//8个字节
}*p=0x100000;//上面全部加起来就是20,所以这里结构体的大小就是20个字节
//这里我们假设p的地址就是0x100000
int main()
{printf("%p\n", p + 0x1);//结构体指针加1也就是跳过一个结构体,相当于加了十进制的20个字节,转换为16进制就是14//所以这里的地址就是0x100014,使用%p打印出来就是没有0x,前面再补两个0到8个比特位//结果就是00100014printf("%p\n", (unsigned long)p + 0x1);//unsigned long讲0x100000强制转换为无符号的整型为100000//加1也就是100001,最终结果就是00100001printf("%p\n", (unsigned int*)p + 0x1);//unsigned int*转换为无符号的指针//加1也就是加4,最终结果就是00100004return 0;
}
这就是全部的内容,希望能对你有所帮助。你们的支持就是我的动力,感谢!
相关文章:
指针和数组面试题(逐题分析,完善你可能遗漏的知识)
人生不是一种享乐,而是一桩十分沉重的工作。 —— 列夫托尔斯泰 前言:之前我们就学习了数组和指针的知识。 数组:数组就是能够存放一组相同类型的元素,数组的大小取决于数组的元素个数和元素类型。 指针:…...
centos7搭建nfs挂载日志目录完整步骤
NFS服务器配置 1.安装NFS服务 首先使用yum安装nfs服务: yum -y install rpcbind nfs-utils 2.创建共享目录 在服务器上创建共享目录,并设置权限。 mkdir /data/share/ chmod 755 -R /data/share/ 3.配置NFS nfs的配置文件是 /etc/exports &…...
三、JavaScript
目录 一、JavaScript和html代码的结合方式 二、javascript和java的区别 1、变量 2、运算 3、数组(重点) 4、函数 5、重载 6、隐形参数arguments 7、js中的自定义对象 三、js中的事件 四、DOM模型 五、正则表达式 一、JavaScript和html代码的结合方…...
深圳大学计软《面向对象的程序设计》实验11 多继承
A. 在职研究生(多重继承) 题目描述 1、建立如下的类继承结构: 1)定义一个人员类CPeople,其属性(保护类型)有:姓名、性别、年龄; 2)从CPeople类派生出学生类CStudent,…...
并发变成实战-原子变量与非阻塞同步机制
文章目录1.锁的劣势2.硬件对并发的支持2.1 比较并交换2.2 非阻塞的计数器3.原子变量类3.1 原子变量是一种“更好的volatile”3.2 性能比较:锁与原子变量4.非阻塞算法4.1 非阻塞的栈4.2 非阻塞的链表4.3 ABA问题非阻塞算法设计和实现上要复杂的多,但在可伸…...
sql数据库常用操作指令
一、操作库-- 创建库create database db1;-- 创建库是否存在,不存在则创建create database if not exists db1;-- 查看所有数据库show databases;-- 查看某个数据库的定义信息 show create database db1; -- 修改数据库字符信息alter database db1 character set ut…...
4-1 定时任务的示例10个
文章目录前言基本命令与格式示例前言 Linux crontab 是用来定期执行程序的命令。当安装完成操作系统之后,默认都已经安装,并启动此任务调度命令。 crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。 基…...
外贸建站多少钱才能达到预期效果?
外贸建站多少钱才能达到预期效果?这是每个外贸企业都会问的问题。作为一个做外贸建站多年的人,我有一些个人的操盘感想。 首先,我认为外贸建站的投资是非常必要的。 因为在现代社会,网站已经成为外贸企业开展业务的必要工具之一…...
【Java学习笔记】5.Java 基本数据类型
Java 基本数据类型 变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。 因此,通过定义不同类型的变量…...
InnoDB 死锁和问题排查
文章目录死锁(dead lock)示例 1问题排查查看连接的线程查看相关的表查看最近一次的死锁信息查看服务器的锁信息查看正在使用的表如何尽可能地避免死锁死锁(dead lock) 两个及以上的事务各自持有对方需要的锁,导致双方…...
tensorflow07——使用tf.keras搭建神经网络(Sequential顺序神经网络)——六步法——鸢尾花数据集分类
使用tf.keras搭建顺序神经网络 六步法——鸢尾花数据集分类 01 导入相关包 02 导入数据集,打乱顺序 03 建立Sequential模型 04 编译——确定优化器,损失函数,评测指标(用哪一种准确率) 05 训练模型——把各项参入填入…...
关于Java连接Hive,Spark等服务的Kerberos工具类封装
关于Java连接Hive,Spark等服务的Kerberos工具类封装 idea连接服务器的hive等相关服务的kerberos认证注意事项 idea 本地配置,连接服务器;进行kerberos认证,连接hive、HDFS、Spark等服务注意事项: 本地idea连接Hadoo…...
大数据框架之Hadoop:MapReduce(五)Yarn资源调度器
Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.0 引入的集群资源管理系统。用户可以将各种服务框架部署在 YARN 上,由 YARN 进行统一地管理和资源分配。 简言之,Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源&…...
uniapp实现地图点聚合功能
前言 在工作中接到的一个任务,在app端实现如下功能: 地图点聚合地图页面支持tab切换(设备、劳务、人员)支持人员搜索显示分布 但是uniapp原有的map标签不支持点聚合功能(最新的版本支持了点聚合功能)&am…...
经典分类模型回顾2—GoogleNet实现图像分类(matlab版)
GoogleNet是深度学习领域的一种经典的卷积神经网络,其在ImageNet图像分类任务上的表现十分优秀。下面是使用Matlab实现GoogleNet的图像分类示例。 1. 数据准备 在开始之前,需要准备一些图像数据用来训练和测试模型,可以从ImageNet等数据集中…...
Java经典面试题——谈谈 final、finally、finalize 有什么不同?
典型回答 final 可以用来修饰类、方法、变量,分别有不同的意义,final 修饰的 class 代表不可以继承扩展, final 的变量是不可以修改的,而 final 的方法也是不可以重写的(override)。 finally 则是 Java 保…...
C#的Version类型值与SQL Server中二进制binary类型转换
使用C#语言编写的应用程序可以通过.NET Framework框架提供的Version类来控制每次发布的版本号,以便更好控制每次版本更新迭代。 版本号由两到四个组件组成:主要、次要、内部版本和修订。 版本号的格式如下所示, 可选组件显示在方括号 ([ 和…...
软测入门(五)接口测试Postman
Postman 一款Http接口收工测试工具。如果做自动化测试会使用jemter做。 安装 去官网下载即可。 https://www.postman.com/downloads/?utm_sourcepostman-home 功能介绍 页面上的单词基本上都能了解,不多介绍。 转代码&注释 可将接口的访问转为其他语言的…...
UWB通道选择、信号阻挡和反射对UWB定位范围和定位精度的影响
(一)介绍检查NLOS操作时需要考虑三个方面:(1)由于整体信号衰减,通信范围减小。(2)由于直接路径信号的衰减,导致直接路径检测范围的减小。(3)由于阻…...
linux基本功之列之wget命令实战
文章目录前言一. wget命令介绍二. 语法格式及常用选项三. 参考案例3.1 下载单个文件3.2 使用wget -o 下载文件并改名3.3 -c 参数,下载断开链接时,可以恢复下载3.4 wget后台下载3.5 使用wget下载整个网站四. 补充与汇总常见用法总结前言 大家好ÿ…...
学习ROS时针对gazebo相关的问题(重装与卸载是永远的神)
ResourceNotFound:gazebo_ros 错误解决 参考:https://blog.csdn.net/weixin_42591529/article/details/123869969 当将机器人加载到gazebo时,运行launch文件出现如下错误 这是由于缺少gazebo包所导致的。 解决办法:...
几个C语言容易忽略的问题
1 取模符号自增问题 我们不妨尝试写这样的程序 #include<stdio.h> int main(){int n,t5;printf("%d\n",7%(-3));//1printf("%d\n",(-7)%3);//-1while(--t)printf("%d\n",t);t5;while(t--)printf("%d\n",t);return 0; } 运行…...
CentOS 7.9安装Zabbix 4.4《保姆级教程》
CentOS 7.9安装Zabbix 4.4一、配置一览二、环境准备设置Selinux和firewalld设置软件源1.配置ustc CentOS-Base源2.安装zabbix 4.4官方源3.安装并更换epel源4.清除并生成缓存三、安装并配置Zabbix Server安装zabbix组件安装php安装mariadb并创建数据库修改zabbix_server.conf设置…...
路由器与交换机的区别(基础知识)
文章目录交换机路由器路由器和交换机的区别(1)工作层次不同(2)数据转发所依据的对象不同(3)传统的交换机只能分割冲突域,不能分割广播域;而路由器可以分割广播域(4&#…...
Python基础学习9——函数
基本概念 函数是一种能够完成某项任务的封装工具。在数学中,函数是自变量到因变量的一种映射,通过某种方式能够使自变量的值变成因变量的值。其实本质上也是实现了某种值的转换的任务。 函数的定义 在python中,函数是利用def来进行定义&am…...
项目中的MD5、盐值加密
首先介绍一下MD5,而项目中用的是MD5和盐值来确保密码的安全性; 1. md5简介 md5的全称是md5信息摘要算法(英文:MD5 Message-Digest Algorithm ),一种被广泛使用的密码散列函数,可以产生一个128位…...
电商项目后端框架SpringBoot、MybatisPlus
后端框架基础 1.代码自动生成工具 mybatis-plus (1)首先需要添加依赖文件 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.2</version></dependency><de…...
2023年03月IDE流行度最新排名
点击查看最新IDE流行度最新排名(每月更新) 2023年03月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多,这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…...
华为校招机试 - 数组取最小值(Java JS Python)
目录 题目描述 输入描述 输出描述 用例 题目解析 JavaScript算法源码 Java算法源码...
20 客户端服务订阅的事件机制剖析
Nacos客户端服务订阅的事件机制剖析 我们已经分析了Nacos客户端订阅的核心流程:Nacos客户端通过一个定时任务,每6秒从注册中心获取实例列表,当发现实例发生变化时,发布变更事件,订阅者进行业务处理,然后更…...
设计师的素材网站/端口扫描站长工具
小波与小波变换_图文_百度文库 https://wenku.baidu.com/view/d55626d9ac51f01dc281e53a580216fc700a5361.html 图像Haar小波变换 - HanFeiKei的博客 - CSDN博客 https://blog.csdn.net/HanFeiKei/article/details/83584963 转载于:https://www.cnblogs.com/wxl845235800/p/996…...
广告制作网站源码/新产品推广方式有哪些
首先按照《Docker安装CentOS7及MySQL5.7》构建好镜像,实现该镜像可以正常启动,且可以正常连接数据库。创建三台mysql容器三台mysql容器分别对应宿主机的3310,3320,3330端口,三台mysql容器的名字依次为:mysq…...
南充网站建设略奥网络/落实20条优化措施
Description 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N 1) / 2,输出A[1], A[2], …, A[2k - 1]的中位数。即前1,3,5,……个数的中位数。 N ≤ 100000 Solution 这题方法很多,这里介绍splay…...
wordpress评论无法/购物网站
在工作中经常看某一个项目的日志进行分析问题,一般都是日志文件最后多少行有需要的日志当然也需要实时查看日志的最后的多少行,那么这篇就把命令记录一下 临时准备了一个文件来演示 seq 20 > nginx.log1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 查看最后10行记…...
国内可以用wordpress吗/无锡百度快照优化排名
原文: https://blog.csdn.net/carson_ho/article/details/52693322 前言 现在很多App里都内置了Web网页(Hyprid App),比如说很多电商平台,淘宝、京东、聚划算等等,如下图 那么这种该如何实现呢…...
东莞企业怎么做网站建设/汕头seo托管
对于一般的List的排序可以使用java.util.Collections.sort(List, Comparator super T>)這樣簡單易用的方法。但是經常看到有人在問如何對元素的多字段排序。這個問題就像SQL語句裏面的‘Order By’語句,後面可以跟若干個排序條件。譬如對於元素Foo排序࿱…...