C语言 之 理解数组(8)数组和指针相关的题目 详细解答 快来观看

news2025/1/11 14:45:39

文章目录

  • 1. 数组和指针相关题
    • 1.1 一维数组
    • 1.2 字符数组
      • 代码1
      • 代码2
      • 代码3
      • 代码4
      • 代码5
      • 代码6
    • 1.3 二维数组

1. 数组和指针相关题

这里主要讲解的是通过sizeof和strlen来对数组和指针进行更深入的一些了解,建议有兴趣与初学者可以先尝试自己思考来完成。

1.1 一维数组

#include<stdio.h>
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;
}

64位下运行结果:
在这里插入图片描述

解析:

1.sizeof(数组名) 取的是整个数组 计算的是整个数组的大小
2.a是数组名,数组名是首元素地址,类型是int*,a+0 还是首元素的地址,地址的大小为 4/8
3.a是首元素地址, * a 就是对这个首元素解引用,得到的是首元素,大小就为4
4.a是首元素地址,类型是int * ,a+1是跳过一个整形,所以a+1就是第二个元素的地址,大小为4/8
5.a[1]就是第二个元素 大小为4
6.&a是取数组的地址,虽然是数组地址,但也是地址,地址的大小就为4/8
7.这种情况 *& 可以看作是互相抵消了,所以sizeof( *&a) = sizeof(a) 那么就是整个数组的大小 为16
8.&a+1是跳过了整个数字后的位置的地址,地址的大小就为 4/8
9.首元素的地址 大小为4/8
10. 数组第二个元素的地址 大小是4/8

1.2 字符数组

代码1

#include<stdio.h>
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	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;
}

64位下运行结果:
在这里插入图片描述

解析:

1.sizeof(数组名),计算的是整个数组的大小,所以为6
2.arr是数组名,代表首元素地址,arr+0还是首元素地址,地址大小即为 4/8
3.arr是首元素的地址,*arr对首元素接引用,就得到首元素,大小为1
4.arr[1]是第二个元素,大小为1
5.&arr 是数组的地址,数组的地址也是地址,大小为4/8
6.&arr+1,跳过整个数组,指向数组后的空间,也是地址,大小为4/8
7.第二个元素的地址,所以大小为4/8

代码2

#include<stdio.h>
int main()
{
	char arr[] = "abcdef";
	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;
}

64位下运行结果:
在这里插入图片描述

解析:

1.arr是数组名,计算整个数组的大小,由于字符串末尾有个’\0’,所以大小为7
2.arr是首元素的地址,arr+0还是首元素的地址,地址的大小为4/8
3.arr是首元素的地址,*arr就是首元素,大小为1
4.arr[1]是第二个元素,大小为1
5.&arr是整个数组的地址,是地址,那么大小为4/8
6.&arr是数组的地址,+1就跳过了整个数组,指向了数组后的空间,还是地址,大小为4/8
7.这是第二个元素的地址,大小为4/8

代码3

#include<stdio.h>
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));
	return 0;
}

64位下运行结果:
在这里插入图片描述

解析:

1.p是指针变量,所以这里计算的就是指针变量的大小,为4/8
2.p+1就是 ‘b’ 的地址,所以大小为4/8
3.p的类型是char* ,*p就是char类型,大小为1
4.p[0] == *(p + 0) == *p == ‘a’ 大小为1
5.&p是取p的地址,地址的大小为4/8
6.&p+1 是跳过p指针变量后的地址,是地址,大小就为4/8
7.&p[0] 是取出字符串中首字符的地址,+1就是第二个字符的地址,所以大小为4/8

代码4

#include<stdio.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));
	return 0;
}

如果你想运行这串代码,你会发现无法正常运行,因为这里面有的写法是错误的

解析:

1.arr是首元素的地址,由于数组中没有’\0’,就会导致越界访问,一直往下访问,直到遇到’\0’,结果是随机的
2.arr+0是首元素的地址,和上面的结果一样
3.arr是首元素的地址,*arr是首元素,为’a’,‘a’的ascii码值是97,这就相当于把97作为地址传递给strlen,那么strlen得到的就是野指针,所以会出问题
4.这里传的是’b’,为98,也是错误的
5.arr是数组的地址,起始位置为首元素的地址,所以结果也是随机值
6.&arr+1 就是跳过这个数组的后一个位置,那么联系上面的随机值,该值为随机值-6
7.这里得到的是第二个元素的地址,所以值是随机值-1

代码5

#include<stdio.h>
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));
	return 0;
}

这串代码也是无法正常运行

解析:

1.字符串末尾有’\0’,所以大小为6
2.arr是首元素地址,arr+0还是首元素地址,所以大小为6
3.*arr 是 ‘a’,为97,这样的传递出错
4.*arr 是 ‘b’,为98,这样的传递出错
5.&arr取的整个数组的地址,给的地址也是首元素地址,所以也是从数组的第一个元素开始向后找,大小为6
6.&arr+1是跳过一整个数组后的地址,从这个位置开始找,也是要找到’\0’才会停止,所以结果也是随机值
7.这是字符串中的第二个字符的地址,从该位置开始向后找,结果为5

代码6

#include<stdio.h>
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));
	return 0;
}

该代码依旧无法正常运行

解析:
1.这个p可以看作是指向这个字符串的首字符,所以结果为6
2.+1,即指向第二个字符,所以结果为5
3.*p 是 ‘a’,为97,这样的传递出错
4.p[0] == *(p+0) == *p 所以也出错
5.&p是指针变量p的地址,和字符串的关系不大,这个p只是指向这个字符串的一个指针,和这个字符串是分开的,那么strlen(&p),就是从p这个指针变量的起始位置开始向后找,所以答案是随机值(这里要注意与数组的区别)
6.同上,所以也是随机值
7.&p[0]取出字符串首字符的地址,+1是第二个字符的地址,所以结果为5

1.3 二维数组

#include<stdio.h>
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]));
	return 0;
}

64位下运行结果:
在这里插入图片描述

解析:

1.a是数组名,计算的是整个数组的大小,所以大小为48
2.这个a[0][0] 代表的是第一行的第一个元素,大小为4
3.a[0]是第一行的数组名,代表的是第一行的整个数组,而一行的数组有4个元素,所以大小为16
4.a[0]是第一行的数组名,但是a[0]不是单独放在sizeof内部,所以这里的数组名a[0]是数组首元素的地址,即&a[0][0],+1后就是a[0][1]的地址,大小为4/8
5.表示第一行第二个元素,大小为4
6.a为数组名,但是没有单独放在sizeof内部,所以a表示数组首元素的地址,是二维数组首元素的地址,我们前面说过二维数组的元素是一位数组,所以这里的a+1,就是第二个元素,即第二个数组,为第二行,所以a+1是第二行的地址,a+1是数组指针,是地址,大小为4/8
7.a+1是第二行的地址,*(a+1)就是第二行,则大小为16
8.a[0]是第一行的数组名,&a[0]取出的数组的地址,即第一行的地址,&a[0]+1扣手第二行的地址,结果为4/8
9.这个就是对第二行的地址解引用,访问的是第二行,所以大小是16字节
10.a作为数组名没有单独放在sizeo内部,所以表示的是二维数组首元素的地址,而二维数组的元素是一维数组,所以这里就是第一行的地址,*a是对第一行解引用,计算第一行元素的大小,所以结果为16
11.a[3]是第四行的数组名,单独放在sizeof,计算的是第四行这个一维数组的大小,所以结果为16


还剩下一部分指针相关运算的题目在下一篇再写,因为比较花时间
以上内容不一定是正确答案,有错可以向我指出哈,谢谢了

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

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

相关文章

GPT-Pilot —— 让AI来写代码

1.概述 什么是GPT-Pilot&#xff1f; 一个AI开发者伴侣&#xff0c;可以从0开始构建应用程序&#xff0c;可以自己编写代码、配置开发环境、管理开发任务、调试代码。 项目地址&#xff1a;https://github.com/Pythagora-io/gpt-pilot 不仅仅是一个自动完成功能或 PR 消息的助…

CSP-J 2022 读程题16.答案与解析

知识点 普及 逻辑运算 16. 01 #include <iostream> 02 03 using namespace std; 04 05 int main() 06 { 07 unsigned short x, y; 08 cin >> x >> y; 09 x (x | x << 2) & 0x33; 10 x (x | x << 1) & 0x55; 11 y (y …

常见离线语音识别模块功能说明——天问ASR;机芯智能;海凌科;轻语音

本文章从开发方式及功能等方面上进行说明&#xff0c;便于开发者进行选择与开发。 本文章依据截至2024年8月1日各网站资料进行整理编写。 总结&#xff1a; 开发方式上&#xff1a; 天文ASR 有着最灵活的开发方式&#xff0c;可完全按照程序员意愿进行开发&#xff0c;同时有…

零基础进程最详解:进程状态、僵尸进程、孤儿进程、阻塞态、挂起态、进程切换、进程常用命令、进程创建、队列优先级

目录 强烈建议全文阅读&#xff01;&#xff01;&#xff01; 强烈建议全文阅读&#xff01;&#xff01;&#xff01; 强烈建议全文阅读&#xff01;&#xff01;&#xff01; 一、进程状态 二、僵尸和孤儿进程 1、僵尸进程 Z&#xff08;zombie&#xff09; 2、孤儿进…

[012-1].第12节:Mysql的配置文件的使用

6.配置文件的使用 6.1.配置文件的格式 1.查看配置文件&#xff1a;vim /etc/my.cnf 2.在配置文件中华定义了很多组&#xff0c;组名就分别是server&#xff0c;mysqld&#xff0c;mysqld_safe,client,mysql,mysqladmin&#xff0c;每个组下面就可以定制很多启动项&#xff1b…

scrapy框架2

scrapy框架2 一、中间件 &#xff08;下载中间件&#xff09; 利用中间件加cookie 案例&#xff1a;登录以后下载豆瓣的电影信息 def get_cookie_dict():cookie_str登陆后的cookiecookie_dict{}for item in cookie_str.split(";"):key,valueitem.split(""…

遇到缓存问题

问题&#xff1a;在事务中在进行数据库查询所有的数据后&#xff0c;将其中的数据更改几个后&#xff0c;重新进行查询。发现此时返回的数据并不是修改之后的数据。 经过学习后发现是Mybatis的一级缓存问题,同时也了解的Mybatis的二级缓存&#xff1a; Mybatis一级缓存: 当在…

SpringCloud网关 SpringBoot服务 HTTP/HTTPS路由/监听双支持

背景 一般来说SpringCloud Gateway到后面服务的路由属于内网交互&#xff0c;因此路由方式是否是Https就显得不是那么重要了。事实上也确实如此&#xff0c;大多数的应用开发时基本都是直接Http就过去了&#xff0c;不会一开始就是直接上Https。然而随着时间的推移&#xff0c…

WebGoC题解(16) 386.山洞

题目描述 小C和弟弟一起参观影视城&#xff0c;发现里面有m个圆形排列的“小山洞”&#xff0c;山洞用半径20、颜色号为编号的圆表示&#xff0c;由边长是100的线连接&#xff0c;均匀的发布一圈&#xff08;1号洞在正上方&#xff09;。m为8时如下图&#xff1a; 小C跟弟弟提议…

点赞10W+,销售额上百万,如何搭上奥运的流量快车?

2024巴黎奥运会正如火如荼进行中。一边是紧张的赛事与各种抓马事情&#xff0c;一边是法国的浪漫与中国00后的松弛&#xff0c;这届奥运会的看客仿佛瓜田里的猹&#xff0c;忙得不可开交。 作为全球范围内的重大体育盛事&#xff0c;奥运会一直以来都备受公众的热烈关注。 据腾…

Python PDF处理技巧 - 加密和解密PDF

目录 安装Python PDF库 使用Python加密PDF 使用Python设置PDF的安全权限 使用Python解密PDF PDF文档在我们的个人生活和工作中扮演着重要角色。从机密的商业报告到敏感的个人记录&#xff0c;PDF广泛应用于存储和共享重要信息。然而&#xff0c;随着数据泄露和未经授权访问…

facebook脸书登入协议分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;若有侵权&#xff0c;请添加&#xff08;wx&#xff1a;wyqlxl99&#xff09;联系删除 前言: 前段…

MuRF代码阅读

对图像Size的处理, 以适应Transformer 在MVSPlat 当中使用 Center_Crop 裁剪图像&#xff0c;适用于 Transformer 的32 倍数&#xff0c; 其中 焦距 f 不变化&#xff0c;只改变 cx,cy.MuRF 直接对图像进行 插值&#xff0c;合成理想的 size. 根据 ori_size 和 inference_size…

恒驰快讯丨恒驰受邀出席华为云数据库专题销售伙伴思享会

7月25日下午&#xff0c;华为云数据库专题销售伙伴思享会在上海成功落幕。 本次华为云数据库专题销售伙伴思享会&#xff0c;汇集了优秀伙伴、华为云产品专家70人&#xff0c;共同见证了一场关于数据库前沿技术、市场趋势和应用实践的深入交流盛会。上海恒驰信息系统有限公司&a…

【Linux网络编程】套接字Socket

网络编程基础概念&#xff1a; ip地址和端口号 ip地址是网络协议地址&#xff08;4字节32位&#xff0c;形式&#xff1a;xxx.xxx.xxx.xxx xxx在范围[0, 255]内&#xff09;&#xff0c;是IP协议提供的一种统一的地址格式&#xff0c;每台主机的ip地址不同&#xff0c;一个…

【赛事】2024第五届“华数杯”全国大学生数学建模竞赛

为了培养学生的创新意识及运用数学方法和计算机技术解决实际问题的能力&#xff0c;天津市未来与预测科学研究会、中国未来研究会大数据与数学模型专业委员会&#xff08;协办&#xff09;决定举办华数杯全国大学生数学建模竞赛。竞赛的目标是为培养大学生的科学精神及运用数学…

精准识别,无缝转换:2024年顶尖语音转文字技术展示

高效、准确的信息传递与处理成为了我们工作与生活中的重要需求。随着科技的飞速发展&#xff0c;一项革命性的技术——语音转文字软件应运而生。掌握这项技术就能提高工作效率创造更多价值。 1.365在线转文字 链接传送&#xff1a;www.pdf365.cn/ 这个方式虽然不是软件&am…

《四季之歌:春溪潺潺、夏林舞动、秋山守望、冬夜温光》

在这个喧嚣的世界里&#xff0c;有时我们会渴望逃离&#xff0c;去寻找那些安静而纯净的自然角落。每个季节都有它独特的魅力&#xff0c;它们像是大自然精心谱写的交响乐章&#xff0c;我们只需细心聆听&#xff0c;就能感受到四季变换带来的无尽奇境。 春天的序曲&#xff0c…

政企互动 | 南京市雨花台区委副书记王金玉一行莅临聚铭网络视察指导

7月30日&#xff0c;南京市雨花台区委副书记王金玉一行领导莅临聚铭网络进行实地考察与指导。聚铭网络总经理唐开达先生热情接待&#xff0c;双方就聚铭网络的发展现状、业务规模及未来规划展开了深入而愉快的交流。 在唐开达总经理的悉心陪同下&#xff0c;王书记一行深入聚铭…

前后端完全分离实现登录和退出

前后端分离的整合 使用springsecurity前端项目redis完成认证授权的代码 1. 搭建一个前端工程 使用 vue ui搭建&#xff0c;使用webstrom操作 2. 创建一个登录页面 <template><div class"login_container"><!-- 登录盒子 --><div class"l…