指针(五)

1. sizeof 和 strlen 的对比

1.1 sizeof

sizeof 计算变量所占用内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占用空间的大小。

sizeof 只关注占用内存空间的大小,不在乎内存中存放了什么数据。

比如:

1.2 strlen

strlen 是C语言库函数,功能是求字符串长度。函数原型如下:

size_t strlen (const char* str);

strlen 统计的是从 strlen 函数的参数 str 中这个地址开始向后,\0 之前字符串中字符的个数。

strlen 函数会一直向后找 \0 字符,知道找到为止,所以可能存在越界查找

 1.3 sizeof 和 strlen 的对比

sizeof:

(1)sizeof是操作符;

(2)sizeof计算操作数所占内存大小,单位是字节;

(3)不关注内存中存放的是什么数据;

(4)sizeof不挑类型。

strlen:

(1)strlen是库函数,使用需要包含头文件 string.h ;

(2)strlen是求字符串长度的,统计的是\0之前字符的个数;

(3)关注的内存中是否有\0,如果没有,就会往后找,可能越界;

(4)只能针对字符串。

2. 数组和指针笔试题解析

2.1 一维数组

#include <stdio.h>

int main()
{
	//数组名一般表示的是数组首元素的地址
	//例外:1. sizeof(数组名)  ——  数组名表示整个数组,计算的是整个数组的大小,单位是字节
	//     2. &(数组名)       ——  数组名表示整个数组,取出的是数组的地址

	int a[] = { 1, 2, 3, 4 };//a数组有4个元素,每个元素是int类型的数据

	printf("%d\n", sizeof(a));        //16  - 计算的是整个数组的大小
	printf("%d\n", sizeof(a + 0));    //4/8 - a表示的是首元素的地址,a+0还是首元素的地址
	printf("%d\n", sizeof(*a));       //4   - a表示的是首元素的地址,*a就是首元素
	printf("%d\n", sizeof(a + 1));    //4/8 - a表示的是首元素的地址,a+1表示的是第二个元素的地址
	printf("%d\n", sizeof(a[1]));     //4   - a[1]是数组第二个元素
	printf("%d\n", sizeof(&a));       //4/8 - 取出的是数组的地址,数组的地址也是地址
	printf("%d\n", sizeof(*&a));      //16  - sizeof(a)
	printf("%d\n", sizeof(&a + 1));   //4/8 - 是跳过整个数组后的一个地址,是地址
	printf("%d\n", sizeof(&a[0]));    //4/8 - &a[0]是数组第一个元素的地址
	printf("%d\n", sizeof(&a[0] + 1));//4/8 - &a[0]+1等价于a+1,表示的是第二个元素的地址

	return 0;
}

2.2 字符数组

#include <stdio.h>

int main()
{
	char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };//arr数组中有6个元素

	printf("%d\n", sizeof(arr));      //6   - 计算的是整个数组的大小
	printf("%d\n", sizeof(arr+0));    //4/8 - 第一个元素的地址
	printf("%d\n", sizeof(*arr));     //1   - *arr是首元素,计算的就是首元素的大小
	printf("%d\n", sizeof(arr[1]));   //1   - 是第二个元素
	printf("%d\n", sizeof(&arr));     //4/8 - 取出整个数组的地址,是地址
	printf("%d\n", sizeof(&arr+1));   //4/8 - 是跳过整个数组后的一个地址,是地址
	printf("%d\n", sizeof(&arr[0]+1));//4/8 - 等价于arr+1,是第二个元素的地址

	return 0;
}
#include <stdio.h>
#include <string.h>

int main()
{
	char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
    //找\0
	printf("%d\n", strlen(arr));      //随机值
	printf("%d\n", strlen(arr+0));    //随机值
	printf("%d\n", strlen(*arr));     //err —— *arr -> 'a' -> 97 ?
	printf("%d\n", strlen(arr[1]));   //err —— arr[1] -> 'b' -> 98 ?
	printf("%d\n", strlen(&arr));     //随机值
	printf("%d\n", strlen(&arr+1));   //随机值
	printf("%d\n", strlen(&arr[0]+1));//随机值

	return 0;
}

#include <stdio.h>

int main()
{
	char arr[] = {"abcdef"};//arr数组中有7个元素

	printf("%d\n", sizeof(arr));        //7   - 计算的是整个数组的大小
	printf("%d\n", sizeof(arr + 0));    //4/8 - 第一个元素的地址
	printf("%d\n", sizeof(*arr));       //1   - *arr是首元素,计算的就是首元素的大小
	printf("%d\n", sizeof(arr[1]));     //1   - 是第二个元素
	printf("%d\n", sizeof(&arr));       //4/8 - 取出整个数组的地址,是地址
	printf("%d\n", sizeof(&arr + 1));   //4/8 - 是跳过整个数组后的一个地址,是地址
	printf("%d\n", sizeof(&arr[0] + 1));//4/8 - 等价于arr+1,是第二个元素的地址

	return 0;
}
#include <stdio.h>
#include <string.h>

int main()
{
	char arr[] = {"abcdef"};
	//找\0
	printf("%d\n", strlen(arr));        //6 - arr是首元素地址
	printf("%d\n", strlen(arr + 0));    //6 - arr+0是首元素地址
	printf("%d\n", strlen(*arr));       //err —— *arr -> 'a' -> 97 ?
	printf("%d\n", strlen(arr[1]));     //err —— arr[1] -> 'b' -> 98 ?
	printf("%d\n", strlen(&arr));       //6 - &arr虽然是数组的地址,但也是指向数组的其实位置
	printf("%d\n", strlen(&arr + 1));   //随机值
	printf("%d\n", strlen(&arr[0] + 1));//5 - 是第二个元素的地址

	return 0;
}

#include <stdio.h>
#include <string.h>

int main()
{
	char* p = "abcdef";
	
	printf("%zd\n", sizeof(p));        //4/8 - 计算的是指针变量的大小
	printf("%zd\n", sizeof(p + 1));    //4/8 - 表示的是'b'的地址,是地址
	printf("%zd\n", sizeof(*p));       //1   - *p就是'a',大小是1个字节
	printf("%zd\n", sizeof(p[0]));     //1   - p[0] --> *(p+0) --> *p 
	printf("%zd\n", sizeof(&p));       //4/8 - 是指针变量p的地址
	printf("%zd\n", sizeof(&p + 1));   //4/8 - &p+1是指针变量后面的空间,是地址
	printf("%zd\n", sizeof(&p[0] + 1));//4/8 - 是'b'的地址,是地址

	return 0;
#include <stdio.h>
#include <string.h>

int main()
{
	char* p = "abcdef";
	//a b c d e f \0
	printf("%zd\n", strlen(p));        //6
	printf("%zd\n", strlen(p + 1));    //5
	printf("%zd\n", strlen(*p));       //err
	printf("%zd\n", strlen(p[0]));     //err - p[0] --> *(p+0) --> *p 
	printf("%zd\n", strlen(&p));       //随机值
	printf("%zd\n", strlen(&p + 1));   //随机值
	printf("%zd\n", strlen(&p[0] + 1));//5

	return 0;
}

2.3 二维数组

#include <stdio.h>
#include <string.h>

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

	printf("%d\n", sizeof(a));            //12*4 = 48个字节,整个数组
	printf("%d\n", sizeof(a[0][0]));      //4
	printf("%d\n", sizeof(a[0]));         //4*4 = 16个字节 是第一行这个一维数组的数组名
	printf("%d\n", sizeof(a[0]+1));       //4/8  表示a[0][1]的地址
	printf("%d\n", sizeof(*(a[0] + 1)));  //4    表示a[0][1],大小4个字节
	printf("%d\n", sizeof(a + 1));        //4/8  这里的a是数组首元素的地址,应该是第一行的地址,a+1是第二行的地址
	printf("%d\n", sizeof(*(a + 1)));     //4*4 = 16个字节 表示的是第二行一维数组的数组名,计算的是第二行数组的大小
	printf("%d\n", sizeof(&a[0] + 1));    //4/8  &a[0]是第一行的地址,则&a[0]+1就是第二行的地址
	printf("%d\n", sizeof(*(& a[0] + 1)));//16   访问的是第二行,计算的是第二行的大小
	printf("%d\n", sizeof(*a));           //16   a是第一行的地址,所以*a是第一行
	printf("%d\n", sizeof(a[3]));         //16   因为sizeof内部的表达式不会真实计算,所以不存在越界,计算的是第四行的-16

	return 0;
}

3.指针笔试题解析

3.1 题目一:

 3.2 题目二:

3.3 题目三: 

3.4 题目四:

 3.5 题目五:

3.6 题目六:

3.7 题目七: 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【博士每天一篇论文-算法】Continual Learning Through Synaptic Intelligence,SI算法

阅读时间&#xff1a;2023-11-23 1 介绍 年份&#xff1a;2017 作者&#xff1a;Friedemann Zenke&#xff0c;巴塞尔大学弗里德里希米歇尔研究所(FMI) Ben Poole&#xff0c;谷歌 DeepMind 研究科学家 期刊&#xff1a; International conference on machine learning. PMLR…

天线阵列车载应用——前言

本书的总体结构 这本参考书向读者介绍了汽车工业中使用的尖端天线阵列技术。新型通信多阵元天线系统是一种非常有前途的车载设备。例如&#xff0c;智能车辆公路系统(IVHS)包括车对车通信、汽车到路边系统、防撞雷达天线阵列和用于自动巡航控制应用的智能天线阵列&#xff0c;为…

数据可视化工具之选,三选一?

在数据可视化的世界中&#xff0c;选择一款合适的工具对于提升工作效率和洞察力至关重要。本文将对三款主流数据可视化工具进行详细比较&#xff0c;包括山海鲸可视化、Echarts和D3.js&#xff0c;以帮助您做出明智的选择。 山海鲸可视化 山海鲸可视化是一款免费且功能强大的…

手机如何扫描身份证?分享两个方法!

在现代社会&#xff0c;身份证已经成为我们生活中不可或缺的重要证件之一。有时候&#xff0c;我们需要将身份证信息提交给相关部门或者机构&#xff0c;而手动输入身份证信息不仅繁琐&#xff0c;还容易出错。这时&#xff0c;使用手机扫描身份证就成了一个方便快捷的选择。本…

Web性能优化之如何评估网页性能——性能指标和度量工具介绍

前言 用户在访问 web 网页时&#xff0c;大部分都希望网页能够在一秒完成。事实上&#xff0c;加载时间每多 1 秒&#xff0c;就会流失 7%的用户。如果时间超过 8s 用户就会感到不耐烦、会放弃访问。这也就是著名的 “8秒原则”。 虽然当今设备及网络环境都大幅提升&#xff…

C语言assert断言详解指针(3)

各位少年&#xff0c;大家好&#xff0c;我是博主那一脸阳光&#xff0c;今天分享assert法官的断言&#xff0c;指针宝箱的使用。 前言&#xff1a;如果你在计算机的世界中触犯了语法法规&#xff0c;那么编译器就要上线了&#xff0c;就会出现报错。然而想想我们在现实中设计到…

【Linux】Linux基本指令

目录 1.ls指令 2.cd指令 3.touch指令 4.mkdir指令 5.rmdir指令和rm指令 5.1rmdir指令 5.2rm指令 6.man指令 7.cp指令 8.mv指令 9.cat指令 10.more指令 && less指令 10.1more指令 10.2less指令 11.head指令 && tail指令 11.1head指令 11.2tai…

MySQL优化必备知识-索引篇

索引用于快速查找具有特定列值的行。如果没有索引&#xff0c;MySQL必须从第一行开始&#xff0c;然后读取整个表以查找相关行。表越大&#xff0c;成本越高。如果表中有相关列的索引&#xff0c;MySQL可以快速确定在数据文件中间查找的位置&#xff0c;而不必查看所有数据。这…

vue常用指令(v-on传递参数和事件修饰符)

1、传 递 自 定 义 参 数 : 函 数 调 用 传 参 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title…

企业的多域名SSL证书

多域名SSL证书作为一种加密通信的方式&#xff0c;可以有效保护多个网站的用户数据在传输过程中的安全。不管个人或者企事业单位 都可以申请多域名SSL证书&#xff0c;提高网站的安全性&#xff0c;保护网站数据传输安全。今天就随SSL盾了解多域名SSL证书旗下的企业多域名SSL证…

详解SpringCloud微服务技术栈:深入ElasticSearch(4)——ES集群

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;详解SpringCloud微服务技术栈&#xff1a;深入ElasticSearch&#xff08;3&#xff09;——数据同步&#xff08;酒店管理项目&a…

盛水最多的容器(Python+Go)

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。(不能倾斜容器) 输入&#xff1a;[1,8,6,2,5…

windows设置openDNS

windows环境搭建专栏&#x1f517;点击跳转 win系统环境搭建&#xff08;十九&#xff09;——windows设置openDNS 文章目录 win系统环境搭建&#xff08;十九&#xff09;——windows设置openDNS1.什么是openDNS&#xff1f;2.openDNS的ip是多少&#xff1f;3.设置DNS3.1 设置…

linux服务器上安装mysql

今天在华为云上安装mysql&#xff0c;安装命令很简单&#xff0c;就一行命令&#xff1a;sudo apt-get update && sudo apt-get install mysql-server 我安装的是mysql8.0版本&#xff0c;这里主要说一下安装mysql后怎么在外网连接&#xff1a; 1、注释掉 bind-add…

HCIP-Datacom(H12-821)61-70题解析

有需要完整题库的同学可以私信博主&#xff0c;博主看到会回复将文件发给你&#xff01;&#xff08;麻烦各位同学给博主推文点赞关注和收藏哦&#xff09; 61、以下哪个场景不适合部署接口策略路由 A.企业网络多ISP出口的场景下&#xff0c;内网不同的网段通过不同的ISP出口访…

PHP的线程安全与非线程安全模式选哪个

曾经初学PHP的时候也很困惑对线程安全与非线程安全模式这块环境的选择&#xff0c;也未能理解其中意。近来无意中看到一个教程对线程安全&#xff08;饿汉式&#xff09;&#xff0c;非线程安全&#xff08;懒汉式&#xff09;的描述&#xff0c;虽然觉得现在已经能够很明了透彻…

设计模式_迭代器模式_Iterator

案例引入 编写程序展示一个学校院系结构: 需求是这样&#xff0c;要在一个页面中展示出学校的院系组成&#xff0c;一个学校有多个学院&#xff0c;一个学院有多个系 【传统方式】 将学院看做是学校的子类&#xff0c;系是学院的子类&#xff0c;小的组织继承大的组织 分析&…

串口通信(基于51单片机)

师从江科大 串口介绍 1、串口可以实现两个设备的相互通信。 2、单片机的串口可以使单片机与单片机&#xff0c;单片机与电脑&#xff0c;单片机与多种模块相互通信 3、单片机内部自带UART&#xff08;通用异步收发器&#xff09;&#xff0c;可实现单片机的串口通信 硬件电…

MT6785(Helio G95)芯片性能参数_MTK联发科4G处理器

联发科MT6785平台采用台积电 12 nm FinFET 制程工艺&#xff0c;2*A766*A55架构&#xff0c;搭载Android 12.0/13.0操作系统&#xff0c;主频最高达2.05GHz&#xff0c;搭载HyperEngine 游戏技术&#xff0c;通过四个增强领域的整体增强功能。 搭载 Arm Mali-G76 MC4 GPU 运行速…

【2024】大三寒假再回首:缺乏自我意识是毒药,反思和回顾是解药

2024年初&#xff0c;学习状态回顾 开稿时间&#xff1a;2024-1-23 归家百里去&#xff0c;飘雪送客迟。 搁笔日又久&#xff0c;一顾迷惘时。 我们饱含着过去的习惯&#xff0c;缺乏自我意识是毒药&#xff0c;反思和回顾是解药。 文章目录 2024年初&#xff0c;学习状态回顾一…