指针笔试题讲解(让指针变得简单易懂)

news2024/11/25 19:34:33

数组名的理解 :   数组名就是首元素地址 

 但是有两个例外:

  1. sizeof(数组名)这里的数组名表示整个数组的大小,sizeof(数组名)计算的是整个数组的大小,单位是字节 

 2. &数组名   这里的数组名表示整个数组 ,&数组名取出的是数组的地址

目录

一.笔试题 ( 1 )

sizeof的解释

二.笔试题 ( 2 )

strlen函数的解释 

三 .笔试题 ( 3 )

四. 笔试题 ( 4 )

五.笔试题 ( 5 ) 

一.笔试题 ( 1 )

博主个人建议 : 自己先做一遍,看看哪个做错了,然后再看博主的解释

                          做对的题,自己想想因为什么得这个数,看看与博主的解释一样不

sizeof的解释

sizeof ()是C语言中常用的运算符,可以计算操作数的大小。. sizeof的结果是无符号整数类型,通常用size_t表示。. sizeof可以应用于各种数据类型,包括基本的数据类型,例如整数和浮点类型,指针类型和符合数据类型,结构体等等。

int main()
{
	//一维数组
	int a[] = { 1,2,3,4 };

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

	printf("%d\n", sizeof(&a));
	
	printf("%d\n", sizeof(*&a));
	
	printf("%d\n", sizeof(&a + 1));

	printf("%d\n", sizeof(&a[0]));
	
	printf("%d\n", sizeof(&a[0] + 1));	
	
	return 0;
}

博主自己做了一遍    printf("%d\n", sizeof(&a));   我认为这个打印的是16                                        因为 ,&数组名  ,这里的数组名表示整个数组 ,但是事实上我只想对了一半 

&a - 是取出数组的地址,但是数组的地址也是地址,是地址就是4/8个Byte (在32位下是4个字节,64位下是8个字节)  数组的地址 和 数组首元素的地址 的本质区别是类型的区别,并非大小的区别

上面的代码解释如下:

int main()
{
	//一维数组
	int a[] = { 1,2,3,4 };//4个元素,每个元素使int类型(4个字节)

	printf("%d\n", sizeof(a));
	//数组名a单独放在sizeof内部,数组名表示整个数组,计算的是整个数组的大小单位是字节,是16字节
	
	printf("%d\n", sizeof(a + 0));
	//a并非单独放在sizeof内部,也没有&,所以数组名a是数组首元素的地址,a+0还是首元素的地址
    //是地址大小就是4/8 Byte

	printf("%d\n", sizeof(&a));
	// &a - 是取出数组的地址,但是数组的地址也是地址,是地址就是4/8个Byte
	//数组的地址 和 数组首元素的地址 的本质区别是类型的区别,并非大小的区别
	
	
	printf("%d\n", sizeof(*&a));
	//对数组指针解引用访问一个数组的大小,单位是字节
	//sizeof(*&a) --- sizeof(a) 

	printf("%d\n", sizeof(&a + 1));
	//&a数组的地址,&a+1还是地址,是地址就是4/8个字节

	printf("%d\n", sizeof(&a[0]));
	//&a[0]是首元素的地址, 计算的是地址的大小 4/8 个字节

	printf("%d\n", sizeof(&a[0] + 1));
	//&a[0]是首元素的地址,&a[0]+1就是第二个元素的地址,大小4/8个字节

	return 0;
}

拓展:&a[0] + 1是第二个元素的地址,大小 4/8 个字节

同样表示第二个元素地址的写法还有 &a[1]   &a[0]+1   a+1


二.笔试题 ( 2 )

指针变量的大小和类型无关,不管什么类型的指针变量,大小都是4/8个字节
指针变量是用来存放地址的,地址存放需要多大空间,指针变量的大小就是几个字节
32位环境下,地址是32个二进制位,需要4个字节,所以指针变量的大小就是4个字节
64位环境下,地址是64个二进制位,需要8个字节,所以指针变量的大小就是8个字节 

strlen函数的解释 

strlen函数,只有遇到 ' \0 ' 时才停止  

#include <string.h>

int main()
{
	//字符数组
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr));
	printf("%d\n", strlen(arr + 0));
	printf("%d\n", strlen(*arr));
	printf("%d\n", strlen(arr[1]));
	printf("%d\n", strlen(&arr));
	printf("%d\n", strlen(&arr + 1));
	printf("%d\n", strlen(&arr[0] + 1));
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr + 0));
	printf("%d\n", sizeof(*arr));
	printf("%d\n", sizeof(arr[1]));
	printf("%d\n", sizeof(&arr));
	printf("%d\n", sizeof(&arr + 1));
	printf("%d\n", sizeof(&arr[0] + 1));
	return 0;
}

自己要先做一遍!!!!!!!!!!!!!!!!再看解释

博主,自己做的时候,printf("%d\n", sizeof(*arr)); 

我认为它应该是4个字节,又是想对了一半

arr是首元素的地址,正常来说地址是4/8个字节,但是它是*arr

*arr就是第一个元素所以它是 1 个字节
    

int main()
{
	//字符数组
	char arr[] = { 'a','b','c','d','e','f' };//6

	printf("%d\n", strlen(arr));//随机值,arr是首元素的地址	
	printf("%d\n", strlen(arr + 0));//随机值,arr是首元素的地址, arr+0还是首元素的地址
	printf("%d\n", strlen(*arr));//err,arr是首元素的地址, *arr就是首元素 - 'a' - 97
	//站在strlen的角度,认为传参进去的'a'-97就是地址,97作为地址,直接进行访问,就是非法访问
	printf("%d\n", strlen(arr[1]));//err, 'b' - 98
	printf("%d\n", strlen(&arr));//随机值
	//&arr -- char (*)[6]
	//const char*
	printf("%d\n", strlen(&arr + 1));//随机值
	printf("%d\n", strlen(&arr[0] + 1));//随机值
	printf("%d\n", sizeof(arr));//6 数组名arr单独放在sizeof内部,计算的是整个数组的大小,单位是字节
	printf("%d\n", sizeof(arr + 0));//arr是首元素的地址==&arr[0],是地址就是4/8个字节
	printf("%d\n", sizeof(*arr));//arr是首元素的地址,*arr就是首元素,大小就是1Byte
	printf("%d\n", sizeof(arr[1]));//1
	printf("%d\n", sizeof(&arr));//&arr是数组的地址,sizeof(&arr)就是4/8个字节
	printf("%d\n", sizeof(&arr + 1));//&arr+1 是跳过数组后的地址,是地址就是4/8个字节
	printf("%d\n", sizeof(&arr[0] + 1));//第二个元素的地址,是地址就是4/8Byte
	return 0;
}

    


三 .笔试题 ( 3 )

int main()
{
	char arr[] = "abcdef";
	printf("%d\n", strlen(arr));
	printf("%d\n", strlen(arr + 0));
	printf("%d\n", strlen(*arr));
	printf("%d\n", strlen(arr[1]));
	printf("%d\n", strlen(&arr));
	printf("%d\n", strlen(&arr + 1));
	printf("%d\n", strlen(&arr[0] + 1));*/
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr + 0));
	printf("%d\n", sizeof(*arr));
	printf("%d\n", sizeof(arr[1]));
	printf("%d\n", sizeof(&arr));
	printf("%d\n", sizeof(&arr + 1));
	printf("%d\n", sizeof(&arr[0] + 1));

	return 0;
}

 自己要先做一遍!!!!!!!!!!!!!!!!再看解释 ( 重要的事情说三遍)

 printf("%d\n", sizeof(arr));我认为这个是 6 但是结果是7,因为我少算了一个 ' \0 '

a b c d e f \0   共7个

(每个笔试题必须要错一个,脑袋疼)
 

int main()
{
	char arr[] = "abcdef";
	printf("%d\n", strlen(arr));//字符串长度,遇到'\0'停止所以是6
	printf("%d\n", strlen(arr + 0));//字符串长度,遇到'\0'停止,6
	printf("%d\n", strlen(*arr));//err 传参错误,应该传的是字符串的地址
	printf("%d\n", strlen(arr[1]));//传参错误,道理同上
	printf("%d\n", strlen(&arr));//数组首元素地址,6
	printf("%d\n", strlen(&arr + 1));//随机值
	printf("%d\n", strlen(&arr[0] + 1));//从b开始往后所以答案是5
	printf("%d\n", sizeof(arr));//整个数组包括'\0'所以是7
	printf("%d\n", sizeof(arr + 0));//第一个元素地址
	printf("%d\n", sizeof(*arr));//第一个元素地址
	printf("%d\n", sizeof(arr[1]));//第二个元素地址
	printf("%d\n", sizeof(&arr));//整个数组地址
	printf("%d\n", sizeof(&arr + 1));//跳过整个数组后的地址
	printf("%d\n", sizeof(&arr[0] + 1));//第二个元素地址
	return 0;
}

四. 笔试题 ( 4 )

int main()
{
	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", sizeof(p));
	printf("%d\n", sizeof(p + 1));
	printf("%d\n", sizeof(*p));
	printf("%d\n", sizeof(p[0]));
 	printf("%d\n", sizeof(&p));
	printf("%d\n", sizeof(&p + 1));
	printf("%d\n", sizeof(&p[0] + 1));
    return 0;

}

我这次错了很多 (可能是眼睛太大了,没看见是 char* p )

 大家在看东西的时候一定要观察仔细!!!!

       printf("%d\n", strlen(p + 1));首元素地址+1,从b开始所以应该是5

       printf("%d\n", strlen(&p)    随机值,

       printf("%d\n", strlen(&p + 1));随机值
大家有什么不懂的可以去看笔试题 ( 3 )的解释

	printf("%d\n", strlen(p));   //6
	printf("%d\n", strlen(p + 1));  //5
	printf("%d\n", strlen(*p));   //err
	printf("%d\n", strlen(p[0])); //err
	printf("%d\n", strlen(&p));   //随机值
	printf("%d\n", strlen(&p + 1));//随机值
	printf("%d\n", strlen(&p[0] + 1));    //5
    printf("%d\n", sizeof(p));//4/8 计算的是指针变量的大小
	printf("%d\n", sizeof(p + 1));//p+1还是地址,大小是4/8个字节
	printf("%d\n", sizeof(*p));//1个字节, *p == 'a'
	printf("%d\n", sizeof(p[0]));//1个字节, p[0]--> *(p+0) --> *p == 'a';
 	printf("%d\n", sizeof(&p));//4/8个字节,&p 是地址
	printf("%d\n", sizeof(&p + 1));//&p是地址,&p+1还是地址,是地址就是4/8个字节
	printf("%d\n", sizeof(&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 + 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]));

int main()
{
	int a[3][4] = { 0 };

	printf("%zd\n", sizeof(a));//48-数组名a单独放在了sizeof内存,表示整个数组,sizeof(a)计算的是数组的大小,单位是字节
	printf("%zd\n", sizeof(a[0][0]));//4-a[0][0]是数组的第一行第一个元素,这里计算的就是一个元素的大小,单位是字节
	printf("%zd\n", sizeof(a[0]));//16 - a[0]是第一行这个一维数组的数组名,数组名单独放在了sizeof内部
	//a[0]就表示整个第一行这个一维数组,sizeof(a[0])计算的整个第一行这个一维数组的大小

	printf("%zd\n", sizeof(a[0] + 1));//4/8 - a[0]并非单独放在sizeof内部,也没有&,所以a[0]表示第一行这个一维数组首元素的地址
	//也就是第一行第一个元素的地址
	//a[0] <---> &a[0][0]
	//a[0]+1 ---> &a[0][1]
	printf("%zd\n", sizeof(*(a[0] + 1)));//4 - a[0] + 1是第一行第二个元素的地址,*(a[0] + 1))就是第一行第二个元素
	//
	printf("%zd\n", sizeof(a + 1));//4/8
	//a 作为二维数组的数组名,并没有单独放在sizeof内部,也没有&,a就是数组首元素的地址,也就是第一行的地址, a 的类型是 int(*)[4]
	//a+1 就是第二行的地址,类型是:int(*)[4]
	//
	printf("%zd\n", sizeof(*(a + 1)));//16 a+1是第二行的地址,*(a+1)就是第二行,计算的就是第二行的大小
	//另外一个角度理解:*(a+1) -- a[1]
	//sizeof(a[1]) - a[1]这个第二行的数组名,单独放在了sizeof内部,计算的是第二行的大小

	printf("%zd\n", sizeof(&a[0] + 1));//4/8
	//a[0]是第一行的数组名,&a[0]取出的是数组的地址,取出的是第一行这个一维数组的地址,类型就是int(*)[4]
	//&a[0]+1 就是第二行的地址,类型就是int(*)[4]
	printf("%zd\n", sizeof(*(&a[0] + 1)));//*(&a[0] + 1)得到的就是第二行,计算的就是第二行的大小

	printf("%zd\n", sizeof(*a));//16
	//a表示数组首元素的地址,也就是第一行的地址
	//*a 就是第一行,也就相当于是第一行的数组名
	//*a--> *(a+0) -- a[0]
	//
	printf("%zd\n", sizeof(a[3]));//16-不会越界,
	//a[3] --    arr[0]
	//int [4]    int [4]
	

	//int a = 10;
	//sizeof(a);//sizeof(int)

	//表达式 有2个属性:值属性,类型属性
	//2+3    = 5
	//       = int
	  
	return 0;
}

新人博主,如果有地方解释的不对或者不清晰,麻烦大佬们海涵,如果可以麻烦从评论区指出,我一定会加以修改,万分感谢

最后麻烦大佬们动一下发财的小手一键三连,千万分感谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1023979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MouseBoost 3.2.3 Pro右键助手 for Mac

MouseBoost Mac 右键助手是一款专为 Mac 平台开发的鼠标增强工具&#xff0c; 其主要特点如下&#xff1a; 1. 可自定义菜单&#xff1a;MouseBoost Mac 右键助手允许用户自定义右键菜单&#xff0c;可以添加或删除菜单项&#xff0c;以适应不同用户的需求。 2. 多种快捷操作&a…

蓝桥杯 题库 简单 每日十题 day5

01 字符计数 #include<stdio.h> int main() { char c; int i,j0,k0; while((cgetchar())!\n){if(ca||ce||ci||cu||co)j;else k;} printf("%d\n%d",j,k); return 0; }02 棋盘 #include<iostream> using namespace std; const int N 2010; int n,m; int …

C++const关键字

本文旨在讲解C中相关const关键字的详解&#xff0c;希望读完本篇文章&#xff0c;可以让诸位对C中的const关键字有更深一步的认识&#xff01; 在C中&#xff0c;若想让类中某一个变量不再改变&#xff0c;可以使用const关键字进行修饰&#xff0c;让数据不被修改&#xff0c;使…

【AI视野·今日Robot 机器人论文速览 第三十六期】Tue, 19 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Tue, 19 Sep 2023 (showing first 100 of 112 entries) Totally 112 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers General In-Hand Object Rotation with Vision and Touch Authors Haozhi Qi, Brent Yi…

element-ui问题合集(el-input-number加减一次就失效,el-select同时收集id与name)

el-select同时收集id与name 将id与name拼接成字符串&#xff0c;赋值给value&#xff0c;在使用时&#xff0c;获取value后&#xff0c;再使用split()方法进行分割 <el-select><el-option v-for"item in selectAttr" :label"item.name" :value&…

【深度学习-第3篇】使用MATLAB快速实现CNN分类(模式识别)任务,含一维、二维、三维数据演示案例

在本文中&#xff0c;我们将介绍如何使用 MATLAB 中的 Convolutional Neural Network&#xff08;CNN&#xff09;进行分类任务。我们将使用 MATLAB 的 Deep Learning Toolbox 来创建、训练和评估 CNN。 一、一个简单的案例 1 安装和准备 首先&#xff0c;确保已安装 MATLAB…

chat-gpt笔记:参数temperature与top_p

temperature 官方文档 temperature number or null Optional Defaults to 1 What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. We…

Apache Hive 入门

目录 一、Apache Hive概述 1.1 什么是Hive ​1.2 为什么使用 Hive 1.3 Hive 和 Hadoop 关系 二、场景设计&#xff1a;如何模拟实现Hive功能 2.1 如何模拟实现 Apache Hive 的功能 2.2 映射信息记录 2.3 SQL 语法解析、编译 2.4 最终效果 ​三、Apache Hive 架…

【链表】K 个一组翻转链表-力扣 25 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

【前端知识】Three 学习日志(九)—— 阵列立方体和相机适配体验

Three 学习日志&#xff08;九&#xff09;—— 阵列立方体和相机适配体验 一、双层for循环创建阵列模型 //创建一个长方体几何对象Geometry const geometry new THREE.BoxGeometry(100, 100, 100); //材质对象Material const material new THREE.MeshLambertMaterial({col…

卷运维不如卷网络安全

最近发现很多从事运维的选择了辞职&#xff0c;重新规划自己的职业发展方向。运维工程师这个岗位在IT行业里面确实是处于最底层的&#xff0c;不管什么环节出现问题&#xff0c;基本都是运维背锅。背锅也就罢了&#xff0c;薪资水平也比不上别的岗位。 一般运维的薪资水平大多数…

【Spark】win10配置IDEA、saprk、hadoop和scala

终于&#xff0c;要对并行计算下手了哈哈哈。 一直讲大数据大数据&#xff0c;我单次数据处理量大概在1t上下&#xff0c;是过亿级的轨迹数据。 用python调用multiprogress编写的代码&#xff0c;用多线程也要一个多月跑完。 我对这个效率不太满意&#xff0c;希望能快一点再快…

Mac cocoapod 3分钟安装教程( 国内镜像源方法)

参考链接&#xff1a;2023最新总结&#xff0c;Mac下使用Homebrew完全指南&#xff01; - 知乎 1.打开终端&#xff0c; 执行&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 2.运行&#xff0c;可以选择清…

十、性能测试之数据库测试

性能测试之数据库测试 一、 数据库分类二、 mysql安装及密码的修改1、安装&#xff1a;数据库的版本 mysql5.7版方法1&#xff1a;直接安装方法2&#xff1a;使用rpm包安装方法3&#xff1a;docker方式安装 2、修改数据库的密码3、创建库4、创建表 三、存储引擎1、InnoDB特点 2…

【Java 基础篇】Java字节打印流详解:处理二进制数据的利器

当你需要将数据输出到文件或其他输出目标时&#xff0c;Java中的字节打印流是一个非常有用的工具。本文将详细介绍Java字节打印流&#xff0c;包括它的基本用法、常用方法以及一些实际应用示例。 什么是字节打印流&#xff1f; 在Java中&#xff0c;字节打印流是用于将字节数…

【MATLAB】安装 shared_slreportgen_reportexplorer_common 时检测到以下错误

解决方法 下载matlab的时候以及安装的时候关闭杀毒软件。 然后也可以把simulink和DSP以及signal processing 相关的toolbox全部不勾选&#xff08;推荐&#xff09; 这两个工具箱没有其实没啥大的影响&#xff0c;就是信号处理这块的增强功能没有了 &#xff08;来自&#xff…

【Windows】你所使用的用户账户没有启用此任务的权限

【Windows】你所使用的用户账户没有启用此任务的权限 1. 故障现象 有一台腾讯云的服务器更新补丁,更新后需要禁用自动重启.发生了以下报错 2. 解决方法 2.1 下载pstools 工具下载地址 https://learn.microsoft.com/zh-cn/sysinternals/downloads/pstools 将软件复制到桌…

理解MTU VLAN与端口VLAN两个概念

什么是MTU VLAN MTU VLAN 是指将最大传输单元&#xff08;Maximum Transmission Unit&#xff0c;MTU&#xff09;设置为特定值以适应 VLAN 环境的配置。 MTU 是指在网络通信中可以传输的最大数据包大小。以太网的常见 MTU 值为1500字节&#xff0c;这是指在以太网帧中的数据…

【hudi】数据湖客户端运维工具Hudi-Cli实战

数据湖客户端运维工具Hudi-Cli实战 help hudi:student_mysql_cdc_hudi_fl->help AVAILABLE COMMANDSArchived Commits Commandtrigger archival: trigger archivalshow archived commits: Read commits from archived files and show detailsshow archived commit stats: …

<硬件设计>运放+三极管组成的恒流源VI电路设计与分析

目录 01 原理介绍&描述 运放的虚短和虚断 02 恒流源描述&分析 简单恒流源电路 简单恒流源电路描述 恒流源电路分析 恒流源VI电路 恒流源VI电路描述 恒流源VI电路分析 恒流源应用场景 03 恒流源VI电路示例 示例原理图&描述 恒流原理分析 恒流原理 恒…