c语言修炼之指针和数组笔试题解析(1.2)

news2024/10/7 16:16:07

前言:

书接上回,让我们继续开始今天的学习叭!废话不多说,还是字符数组的内容上代码!

char *p是字符指针,*表示p是个指针,char表示p指向的对象类型是char型!

char*p="abcdef";

 当我们把字符串abcdef的地址存放在p中时,p是存了整个字符串还是之存了a的地址呢?这得对代码进行调试啦

此时我们会发现p中的地址也就是字符串中a的地址!让我们继续开始学习啦

int main()
{
	char* p = "abcdef";
	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));
	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));
	return 0;
}

开始分析叭

printf("%d\n", sizeof(p));

p中存放的是a的地址,sizeof(p)求的是地址的大小,地址的大小是4/8个字节大小

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

p指向字符串中a的地址,p+1则指向字符串中b的地址,sizeof(p+1)求的是地址的大小,地址大小是4/8个字节大小

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

 p指向字符串中a的地址,*p指的是a,sizeof(*p)-->sizeof(a)所以大小为1字节

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

p[0]-->*(p+0)-->*(p),p中存放的是a的地址,所以*p指向a,sizeof(p[0])计算的是sizeof(a)的大小,结果为1

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

p中存放的是字符串的地址,p的类型为char*,p本身也有地址,其类型为char**!所以sizeof(&p)计算的也是地址的大小,其结果为4/8

 接着来分析下一个代码叭

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

&p将p的地址取出在进行加1,具体的地址是啥咱也不知道,但有一点可以确定的就是sizeof(&p+1)计算的是地址的大小,地址大小是4/8个字节大小

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

&(*p+0)-->p的地址,&p[0]+1得到的是字符串中b的地址,所以此时sizeof计算的是地址的大小,地址大小是4/8字节。通过调试代码可以发现确实是b的地址

接下来我们用strlen来,上代码 !还记得strlen的特点吗?计算遇\0之前的字符个数,字符串会隐藏一个\0

printf("%d\n", strlen(p));

p依旧是指向字符串中a的地址,strlen在计算时从a的地址开始一直到遇到\0,那么此时的计算结果为6个字节

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

p依旧是指向字符串中a的地址,因此p+1指向的是字符串中b的地址,此时strlen在计算时从b的地址开始计算一直到遇\0,此时计算结果为5

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

p依旧是指向字符串中a的地址,*p得到的就是a,还记得在上一篇中说的吗,strlen需要的参数是const char*类型的地址而不是字符a,因此strlen(*p)得到的结果是error

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

 p[0]-->*(p+0)-->*p-->a,解释同上,结果为error

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

 strlen(&p)虽然里面计算的也是地址,但是我们不知道会在什么时候遇到\0,因此此时的结果为随机值

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

strlen(&p+1)即使经行加1了,还是不知道啥时候会遇到\0,结果还是随机值

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

&p[0]-->&*(p+0)-->p,p中存放的是a的地址,因此&p[0]+1此时指向字符串b中的地址,strlen(&p[0]+1)的计算结果为5字节

欧克,解析完毕,一起来运行代码看看叭,当然啦结果错误的咱就不运行啦

 以上有关于一维数组的题我们就讲解完毕啦,接下来开始二维数组的题目讲解,还记得二维数组的知识吗?二维数组的行和列都是从0开始的,以int a[3][4]为例,这个二维数组的类型是int [3][4],二维数组在内存中的存储是连续的,二维数组的行可以省略不写,但是列不可以省略!二维数组可以理解为一维数组的数组!一维数组的写法是int a[3]即数组名+[ ],二维的写法是int a[3][4]可以将int a[3]看作是数组名,也可以写为数组名+[ ]!将二维的每一行看成一维的元素

接下来继续看看代码叭!

int main()
{	
   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 a[3][4]是一个三行四列的二维数组,每个元素是int型,总共有12个元素

开始分析叭!先来第一个代码! 

 printf("%d\n", sizeof(a));

sizeof(数组名)计算的是整个数组的大小,一共有12个元素一个元素的大小为4字节,所以整个数组的大小是48字节

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

a[0]是二维数组的一行,a[0][0]是第一行的第一个元素,sizeof(a[0][0])-->sizeof(int),其计算结果为4

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

a[0]是二维数组的第一行,sizeof(a[0])计算的是整个第一行数组的大小,一行有4个元素,所以整个第一行的大小为16字节大小

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

sizeof(a[0]+1),由于不是单独放在sizeof内部,因此a[0]表示的是数组首元素的地址。a[0]+1表示的是二维数组第一行的第二个元素的地址,sizeof(a[0]+1)计算的是地址的大小,地址大小是4/8个字节大小

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

上面我们分析出a[0]+1表示的是二维数组第一行的第二个元素的地址,所以*(a[0]+1)表示的是一个二维数组第一行第二个元素,sizeof计算的是元素大小,其结果为4字节

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

由于数组名不是单独放在sizeof内部,因此此时数组名表示的是数组首元素的地址,a+1表示数组第二个元素的地址,即二维数组第二行的地址,sizeof计算地址的大小,其结果为4/8

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

 由上面可得a+1表示数组第二个元素的地址,即二维数组第二行的地址,对其进行解引用得到第二行整个数组大小,其结果为16

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

a[0]表示二维数组的第一行数组,&a[0]取出二维数组第一行数组的整个地址,&a[0]+1得到二维数组第二行的地址。sizeof此时计算的还是地址的大小,结果为4/8

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

&a[0]取出二维数组第一行数组的整个地址,&a[0]+1得到二维数组第二行的整个地址,对其经行解引用再计算其大小,结果为16字节

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

a不是单独放在sizeof内部,因此此时a表示数组首元素的地址,二维数组首元素地址a[0],对其经行解引用得到整个第一行数组的大小,sizeof对其进行计算,得到结果为16字节

 最后一道题啦

printf("%d\n", sizeof(a[3]));

 哦豁,a[3]?这个二维数组也才3行,计算a[3]的大小会不会越界访问呐?不会哒,这里酱酱们可以放心去计算呐!一般来说代码要进行编译+运行才会形成可执行文件,sizeof在编译阶段就计算好结果,因此不会造成越界访问的情况!sizeof(a[3])就计算的是整个数组的大小,其结果为16字节大小

运行一下代码看看结果叭

 3.指针部分

 上代码!

int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    int* ptr = (int*)(&a + 1);
    printf("%d,%d", *(a + 1), *(ptr - 1));
    return 0;
}
//程序的结果是什么?

 数组a是一个一维数组里面存放了五个元素,&a取出的是整个数组的地址此时应该用数组指针来接收,但这里将其强制类型转化为int*类型。

 a表示数组首元素的地址,a+1表示数组第二个元素 的地址,*(a+1)表示数组第二个元素2,int*ptr=(int*)(&a+1),ptr的指向和&a+1的指向一致,ptr-1此时指向a[4]的地址,对其进行解引用得a[4]-->5,所以这道题的答案为2 ,5。运行一下代码看

 


今天的学习就到这啦,明天继续噢!

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

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

相关文章

第一百一十四天学习记录:C++提高:类模板案例(黑马教学视频)

类模板案例 main.cpp代码&#xff1a; #include "myarray.hpp"void printIntArray(MyArray <int>& arr) {for (int i 0; i < arr.getSize(); i){cout << arr[i] << " ";}cout << endl; }void test01() {MyArray <int&…

AIGC分享交流平台、GPT-4、GPT实时联网、Claude

拥有无限畅谈的AI个人助理&#xff0c;提高效率和创造力&#xff0c;引领未来的智能生活&#xff1b; 不仅承载着最前沿的科技理念&#xff0c;更集成了对人工智能可能性的深度理解。 已支持基于GPT、Claude等主流大模型的对话内容生成、支持GPT联网查询实时信息&#xff1b;基…

241. 为运算表达式设计优先级

题目描述&#xff1a; 主要描述&#xff1a; 区间dp问题。 class Solution { public:vector<int> diffWaysToCompute(string expression) {vector<int> ops;for(int i0;i<expression.length();i){if(expression[i]>0&&expression[i]<9){int num…

Vue整体架构分解

Vue.js的整体架构可以分解为以下几个部分: 文章目录 1. 数据驱动2. 组件化3. 响应式系统4. 虚拟DOM5. 插件系统6. 单文件组件7. 模板编译总结 1. 数据驱动 Vue的一个核心特点是数据驱动。Vue会在初始化的时候给数据提供一个observe监听&#xff0c;当数据变化时&#xff0c;会…

醉梦仙踪:二叉树狂想曲,中序遍历的华丽穿梭

本篇博客会讲解力扣“94. 二叉树的中序遍历”的解题思路&#xff0c;这是题目链接。 如何对二叉树进行中序遍历呢&#xff1f;所谓中序遍历&#xff0c;即先遍历左子树&#xff0c;接着遍历根节点&#xff0c;最后遍历右子树的一种遍历方式。具体来说&#xff0c;假设有某一种“…

苹果11手机设置手机跟踪功能

苹果11手机设置手机跟踪功能&#xff0c;就算是手机丢了&#xff0c;也能通过查询手机定位在哪里。 第一步&#xff1a;点击Apple ID进入详情 第二步&#xff1a;点击“查找” 第三步&#xff1a; 第四步&#xff1a; 到了这步&#xff0c;就算是设置成功。 下面需要到官方查询…

【STL】 模拟实现简易 vector

目录 1. 读源码 2. 框架搭建 3. vector 的迭代器 4. vector 的拷贝构造与赋值 拷贝构造 赋值 5. vector 的常见重要接口实现 operator[ ] 的实现 insert 接口的实现 erase 接口实现 pop_back 接口的实现 resize 接口实现 源码分享 写在最后&#xff1a; 1. 读源码…

Rust 数据类型 之 类C枚举 c-like enum

目录 枚举类型 enum 定义和声明 例1&#xff1a;Color 枚举 例2&#xff1a;Direction 枚举 例3&#xff1a;Weekday 枚举 类C枚举 C-like 打印输出 强制转成整数 例1&#xff1a;Weekday 枚举 例2&#xff1a;HttpStatus 枚举 例3&#xff1a;Color 枚举 模式匹配…

opencv 图像距离变换 distanceTransform

图像距离变换&#xff1a;计算图像中每一个非零点距离离自己最近的零点的距离&#xff0c;然后通过二值化0与非0绘制图像。 #include "iostream" #include "opencv2/opencv.hpp" using namespace std; using namespace cv;int main() {Mat img, dst, dst…

【STL】模拟实现简易 list

目录 1. 读源码 2. 框架搭建 3. list 的迭代器 4. list 的拷贝构造与赋值重载 拷贝构造 赋值重载 5. list 的常见重要接口实现 operator--() insert 接口 erase 接口 push_back 接口 push_front 接口 pop_back 接口 pop_front 接口 size 接口 clear 接口 别…

数字验证码识别新思路及对opencv支持向量机机器学习总结

验证码识别框架 新问题 最近遇到了数字验证码识别的新问题。 由于这次的数字验证码图片有少量变形和倾斜&#xff0c;所以&#xff0c;可能需要积累更多的原始采样进行学习。但按照4个验证码10个数字的理论随机组合(暗含某种数字仅有少量变化&#xff0c;不然此组合数量还应更…

知识图谱--入门笔记

知识图谱–入门笔记-----整体的概念 1.什么是知识图谱&#xff1f; 描述现实世界中各个实体或者概念之间的关系&#xff0c;其构成一张海量的语义网络图&#xff0c;节点表示实体或者概念&#xff0c;边表示属性或者关系。 2.知识图谱中的三个节点 &#xff08;1&#xff09…

【LeetCode每日一题合集】2023.7.17-2023.7.23(离线算法 环形子数组的最大和 接雨水)

文章目录 415. 字符串相加&#xff08;高精度计算、大数运算&#xff09;1851. 包含每个查询的最小区间⭐⭐⭐⭐⭐解法1——按区间长度排序 离线询问 并查集解法2——离线算法 优先队列 874. 模拟行走机器人&#xff08;哈希表 方向数组&#xff09;918. 环形子数组的最大和…

会议OA项目之会议审批(亮点功能:将审批人签名转换为电子手写签名图片)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于OA项目的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.主要功能点介绍 二.效果展示 三.前端…

AVLTree深度剖析(双旋)

在上一篇文章中我们提到了&#xff0c;单旋的情况&#xff08;无论是左单旋还是右单旋&#xff09;&#xff0c;都仅仅适用于绝对的左边高或者绝对的右边高 b插入&#xff0c;高度变为h1&#xff0c;我们可以来试试单旋会变成什么样子 旋完之后&#xff0c;形成了对称关系&…

自然语言处理之AG_NEWS新闻分类

前言: 先简单说明下&#xff0c;关于AG_NEWS情感分类的案例&#xff0c;网上很多博客写了&#xff0c;但是要么代码有问题&#xff0c;要么数据集不对&#xff0c;要么API过时&#xff0c;在这里我再更新一篇博客。希望对各位同学有一定的应用效果。 1、DataSets 数据集的处理…

部署mycat2

因为mycat是Java写的&#xff0c;要装jdk 下载包 jdk-8u261-linux-x64.rpm 安装 安装好后&#xff0c;查看版本 安装mycat2 解压到data目录 修改权限 把所需的jar复制到mycat/lib目录 查看MyCat目录结构 回为mycat代理连接启动时需要有一个默认的数据源&#xff0c;所以我们…

C#读取写入文件的三种方式

最新对文件的操作比较频繁。这里记录一下常用的几种文件读写的方式。 我这里使用窗体来做测试&#xff0c;例子在文末&#xff0c;可下载。 1&#xff1a;二进制读写 /// <summary>/// 二进制写入文件/// </summary>private void button1_Click(object sender, E…

PuTTY连接服务器报错Connection refused

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

基于SpringBoot + Vue实现单个文件上传(带上Token和其它表单信息)的前后端完整过程

有时遇到这种需求&#xff0c;在上传文件的同时还需要带上token凭据和其它表单信息&#xff0c;那么这个需求前端可以使用FormData数据类型来实现。FormData和JSON一样也是通过body传递的&#xff0c;前者支持字符串和二进制文件&#xff0c;后者只能是字符串&#xff0c;如下图…