C语言——指针和数组练习题解析

指针和数组习题

  • 前言:
  • 一、一维数组
  • 二、字符数组
  • 三、二维数组
  • 四、指针题目

前言:

学习了指针的初阶和进阶后,已经对指针有了一定了解。下面就需要做题目,去巩固所学的知识。
对数组名的理解:
数组名是数组首元素的地址,但是由两个例外

  1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
  2. &数组名,这里的数组名是整个数组,取出的是整个数组的地址。

一、一维数组

#include <stdio.h>
int main()
{int arr1[] = { 1,2,3,4 };printf("%d\n", sizeof(arr1));//16(计算整个数组的大小)printf("%d\n", sizeof(arr1+0));//4/8(数组名arr1是首元素地址,a+0还是首元素的地址,地址的大小为4/8个字节)printf("%d\n", sizeof(*arr1));//4(*arr1是首元素,大小是4个字节)printf("%d\n", sizeof(arr1+1));//4/8(arr1是首元素的地址,arr1+1是第二个元素的地址,地址大小为4/8个字节)printf("%d\n", sizeof(arr1[1]));//4(arr1[1]是第2个元素,大小是4个字节)printf("%d\n", sizeof(&arr1));//4/8(&arr1是数组的地址,数组的地址也是地址,是地址那就是4/8个字节)printf("%d\n", sizeof(*&arr1));//16(&arr1是数组的地址,*&arr1是整个数组的元素,是16个字节)printf("%d\n", sizeof(&arr1+1));//4/8(&arr1是整个数组的地址,&arr1+1是跳过了整个数组的下一个地址,是地址那就是4/8个字节)printf("%d\n", sizeof(&arr1[0]));//4/8(arr1[0]是首元素,&arr1[0]是首元素的地址,是地址那就是4/8个字节)printf("%d\n", sizeof(&arr1[0]+1));//4/8(&arr1[0]是首元素的地址,&arr1[0]+1是第二个元素的地址,是地址那就是4/8个字节)return 0;
}

二、字符数组

#include <stdio.h>
#include <string.h>
int main()
{char arr2[] = { 'a','b','c','d','e','f' };printf("%d\n", sizeof(arr2));//6(数组名单独放在sizeof内部,这里的arr2表示整个数组,计算的是整个数组的大小,单位是字节,大小为6个字节)printf("%d\n", sizeof(arr2+0));//4/8(arr2表示数组的首元素地址,arr2+0还是数组的首元素地址,是地址就是4/8个字节)printf("%d\n", sizeof(*arr2));//1(arr2表示数组的首元素地址,*arr2表示首元素,大小为1个字节)printf("%d\n", sizeof(arr2[1]));//1(arr2[1]表示第二个元素,大小为1个字节)printf("%d\n", sizeof(&arr2));//4/8(&arr2是整个数组的地址,是地址就是4/8个字节)printf("%d\n", sizeof(&arr2+1));//4/8(&arr2是整个数组的地址,&arr2+1是跳过整个数组后的地址,是地址就是4/8个字节)printf("%d\n", sizeof(&arr2[0]+1));//4/8(&arr2[0]是数组的首元素地址,&arr2[0]+1是第二个元素的地址,是地址那就是4/8个字节)printf("%d\n", strlen(arr2));//随机值(因为字符数组中没有\0,所以求字符长度的时候,会一直往后找,产生的结果是随机值)printf("%d\n", strlen(arr2+0));//随机值(arr2+0是数组的首元素地址,是随机值)printf("%d\n", strlen(*arr2));//非法访问(arr2是数组的首元素地址,*arr2是数组首元素,就是字符‘a’也是97,strlen就从97这个地址开始访问,统计字符串长度,非法访问)printf("%d\n", strlen(arr2[1]));//非法访问(arr2[1]是第二个元素‘b’,以第二个元素的值为地址开始访问,统计字符串长度,非法访问)printf("%d\n", strlen(&arr2));//随机值(&arr2是整个数组的地址,数组的地址和数组首元素的地址,值是一样的,传递给strlen函数,从数组第一个位置开始统计字符串长度,结果是随机值)printf("%d\n", strlen(&arr2+1));//随机值(&arr2是整个数组的地址,&arr2+1跳过整个数组后的地址,然后开始统计字符串长度,结果为随机值)printf("%d\n", strlen(&arr2[0]+1));//随机值(&arr2[0]是首元素的地址,&arr2[0]+1是第二个元素的地址,从第二个元素地址开始统计字符串长度,结果为随机值)char arr3[] = "abcdef";printf("%d\n", sizeof(arr3));//7(计算整个数组的大小,‘\0’也统计在内,为7个字节)printf("%d\n", sizeof(arr3 + 0));//4/8(arr3为数组首元素地址,arr3 + 0也是数组首元素地址,是地址就是4/8个字节)printf("%d\n", sizeof(*arr3));//1(arr3为数组首元素地址,*arr3为数组首元素,首元素为1个字节)printf("%d\n", sizeof(arr3[1]));//1(arr3[1]为第二个元素,占1个字节)printf("%d\n", sizeof(&arr3));//4/8(&arr3为整个数组的地址,是地址那就是4/8个字节)printf("%d\n", sizeof(&arr3 + 1));//4/8(&arr3为整个数组的地址,&arr3 + 1跳过整个数组后的地址,是地址那就是4/8个字节)printf("%d\n", sizeof(&arr3[0] + 1));//4/8(&arr3[0]是首元素的地址,&arr3[0] + 1是第二个元素的地址,是地址那就是4/8个字节)printf("%d\n", strlen(arr3));//6(计算字符串的长度,为6)printf("%d\n", strlen(arr3 + 0));//6(arr3为首元素地址,arr3 + 0还是首元素地址,从首元素地址开始访问,统计字符串长度,字符串长度为6)printf("%d\n", strlen(*arr3));//非法访问(*arr3为数组首元素的值,非法访问)printf("%d\n", strlen(arr3[1]));//非法访问(arr3[1]为第二个元素'b',ASCII码值就是98,地址为98,开始统计字符串长度,非法访问)printf("%d\n", strlen(&arr3));//6(&arr3整个数组的地址,也是首元素地址,字符串长度为6)printf("%d\n", strlen(&arr3 + 1));//随机值(&arr3 + 1是跳过整个数组后的地址,然后开始访问,统计字符串长度,为随机值)printf("%d\n", strlen(&arr3[0] + 1));//5(&arr3[0] + 1是第二个元素的地址,从第二个元素开始统计字符串长度,长度为5)char* p = "abcdef";printf("%d\n", sizeof(p));//4/8(p是一个指针变量)printf("%d\n", sizeof(p+1));//4/8(p+1指向第二个元素的地址)printf("%d\n", sizeof(*p));//1(第一个元素,大小为1个字节)printf("%d\n", sizeof(p[0]));//1(数组法,第一个元素,大小为1个字节)printf("%d\n", sizeof(&p));//4/8(&p指向的是p的地址,类型是char**,是地址那就是4/8个字节)printf("%d\n", sizeof(&p + 1));//4/8(&p + 1指向的是‘\0’后面的地址,是地址那就是4/8个字节)printf("%d\n", sizeof(&p[0] + 1));//4/8(&p[0] + 1指向第二个元素的地址,得到的是‘b’的地址,是地址那就是4/8个字节)printf("%d\n", strlen(p));//6(p指向字符串首地址)printf("%d\n", strlen(p+1));//5(p+1指向字符串第二个元素首地址)printf("%d\n", strlen(*p));//非法访问(*p是—>‘a’,以‘a’为地址访问,统计字符串长度,非法访问)printf("%d\n", strlen(p[1]));//非法访问(p[1]为第二个元素‘b’,以‘b’为地址访问,统计字符串长度,非法访问)printf("%d\n", strlen(&p));//随机值(&p指向的是p的地址,类型是char**)printf("%d\n", strlen(&p + 1));//随机值(&p+1,指向的是字符串‘\0’后面的地址,)printf("%d\n", strlen(&p[0] + 1));//5(&p[0] + 1第二个元素的地址,从第二个元素地址统计字符串长度,长度为5)return 0;
}

三、二维数组

#include <stdio.h>
int main()
{int a[3][4] = { 0 };printf("%d\n", sizeof(a));//3*4*4=48(整个数组的字节)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/8(a[0]作为第一行的数组名,没有单独放在sizeof内部,没有&,那么a[0]表示数组的首元素地址,也就是a[0][0]的地址,所以a[0]+1是第一行第二个元素的地址,是地址那就是4/8个字节)printf("%d\n", sizeof(*(a[0]+1)));//4(计算第一行第二个元素的大小)printf("%d\n", sizeof(a+1));//4/8(a是数组首元素地址,是第一行的地址;a+1就是第二行的地址,类型是int(*)[4])printf("%d\n", sizeof(*(a+1)));//16(*(a+1)->a[1]->sizeof(*(a+1))->sizeof(a[1]),计算的是第二行的大小;a+1是第二行的地址,类型int(*)[4],*(a+1)访问的是第二行的数组)printf("%d\n", sizeof(&a[0]+1));//4/8(&a[0]是第一行的地址,&a[0]+1是第二行的地址,是地址那就是4/8个字节)printf("%d\n", sizeof(*( &a[0] + 1)));//16(第二行的大小)printf("%d\n", sizeof(*a));//16(a是数组首元素的地址,就是第一行的地址,*a就是第一行,*a—>*(a+0)—>a[0])printf("%d\n", sizeof(a[3]));//16(不访问,只看类型)return 0;
}

表达式有两个属性:

  1. 值属性:9
  2. 类型属性:s=a+2——>short
#include <stdio.h>
int main()
{int a = 7;short s = 4;printf("%d\n", sizeof(s = a + 2));printf("%d\n", s);return 0;
}

打印:
2
4

四、指针题目

题目1:

#include <stdio.h>
int main()
{int a[5] = { 1,2,3,4,5 };int* ptr = (int*)(&a + 1);printf("%d,%d", *(a + 1), *(ptr - 1));//打印  2,5return 0;
}

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

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

相关文章

Linux Day01

目录 一、Linux终端介绍 二、Linux目录介绍 1.目录结构 2.常见目录说明 3.绝对路径与相对路径 4.家目录 一、Linux终端介绍 二、Linux目录介绍 Linux目录&#xff1a;是从根目录"/"开始的 是一棵倒着的树 1.目录结构 2.常见目录说明 目前记住 bin 存放常用命…

跨境独立站如何应对恶意网络爬虫?

目录 跨境出海独立站纷纷成立 爬虫威胁跨境电商生存 如何有效识别爬虫&#xff1f; 技术反爬方案 防爬虫才能保发展 中国出海跨境电商业务&#xff0c;主要选择大平台开设店铺&#xff0c;例如&#xff0c;亚马逊、eBay、Walmart、AliExpress、Zalando等。随着业务的扩大&…

mysql or 阿里云RDS 随记

文章目录 函数SQL优化表分区索引水位线执行计划&#xff0c;explain 函数 SQL优化 表分区 索引 水位线 执行计划&#xff0c;explain EXPLAIN 是 MySQL 中的一个关键字&#xff0c;用于解释查询执行计划&#xff0c;帮助你理解查询是如何执行的以及使用了哪些索引。执行 …

使用springboot进行后端开发100问

properties和yaml文件怎么互转 安装插件 properties文件和yaml文件区别 properties 文件通过“.”和“”赋值&#xff0c;值前不加空格&#xff0c;yaml通过“:”赋值&#xff0c;值前面加一个空格&#xff1b;yaml文件缩进用空格&#xff1b; properties只支持键值对&#x…

Linux内核的USB 框架

Linux内核的USB框架是管理USB设备的核心组件之一&#xff0c;它负责处理与USB设备相关的请求和操作&#xff0c;并提供了一些通用的函数和数据结构&#xff0c;以简化设备驱动程序的开发。 在Linux内核的USB框架中&#xff0c;最重要的两个结构体是usb_driver和usb_device。us…

Ubuntu下打开QtCreator环境变量LD_LIBRARY_PATH与终端不一致

问题描述&#xff1a; 在unbuntu下使用QtCreator编译、运行程序时&#xff0c;总是出现XXX.so: cannot open shared object file: No such file or directory这类问题&#xff0c;但是在终端中编译或者运行程序则不会出现这些问题。在网上查了好久才明白QtCreator在打开时&…

逻辑漏洞原理及实战

前言 作者简介&#xff1a;不知名白帽&#xff0c;网络安全学习者。 博客主页&#xff1a;不知名白帽_网络安全,CTF,内网渗透-CSDN博客 网络安全交流社区&#xff1a;https://bbs.csdn.net/forums/angluoanquan 目录 逻辑漏洞基础 概述 分类 URL跳转漏洞 概述 危害 漏洞…

Hive调优集锦(2)

3.8 Join 优化 Join优化整体原则&#xff1a; 1、优先过滤后再进行 join 操作&#xff0c;最大限度的减少参与 join 的数据量 2、小表 join 大表&#xff0c;最好启动 mapjoin&#xff0c;hive 自动启用 mapjoin, 小表不能超过25M&#xff0c;可以更改 3、Join on的条件相同的…

51单片机串口

该部分的笔记来自视频教程链接https://www.bilibili.com/video/BV1bt4y197NR/?spm_id_from333.788&vd_sourceb91967c499b23106586d7aa35af46413 一、51单片机串口基础介绍 一般的应用层的协议中采用和校验或CRC校验&#xff0c;而奇偶校验还是解决基本通信中的帧格式中的…

Eclipse整合tomcat时要注意的几点

Eclipse整合tomcat时要注意的几点 1、安装目录及jdk 2、参数配置 注意&#xff1a;Arguments的配置&#xff0c;日志输出文件目录及java内存大小设置等&#xff0c;如下&#xff1a; -Dcatalina.base"E:\apache-tomcat-7.0.52" -Dcatalina.home"E:\apache-tomc…

无符号数和有符号数的“bug”

1. 起因 在实现kmp算法时&#xff0c;出现了诡异的现象&#xff0c;看下面的代码&#xff1a; int KMP (const char *s, const char *t) {int lenS strlen (s);int lenT strlen (t);int next[lenT];get_next (next, t);int i 0;int j 0;while (i < lenS && j …

程序化广告还有未来么?——程序化领域变化的底层逻辑和反思

三、近几年程序化广告领域的变化底层逻辑是什么呢&#xff1f; 当前国内程序化生态的状态&#xff0c;更像是希腊的古典时代&#xff1a;古希腊时代的城邦高度繁荣的时期。很多人可能对古希腊城邦没有概念&#xff0c;我们解释一下&#xff1a; 所谓城邦就是城市国家&#xff0…

涵子来信——自己的电脑——谈谈想法

大家好&#xff1a; 上一次谈论了苹果的那些事&#xff0c;今天我们来聊聊电脑。 我的第一台电脑现在成了这样子&#xff1a; 很多人以为是我自己拆了电脑做研究&#xff0c;其实是我的第一台电脑&#xff0c;真的坏了。 2021年&#xff0c;我有了属于我自己的第一台电脑&am…

链表 --- C语言实现

本篇文章来详细介绍一下数据结构中的链表。 目录 1.链表的概念及结构 2.链表的分类 3.单链表的实现 4.链表的面试题 5.双向链表的实现 6.顺序表和链表的区别 1.链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素…

【HTML5】拖放详解及实现案例

文章目录 效果预览代码实现 效果预览 代码实现 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>一颗不甘坠落的流星</title><style>#div1,#div2 {float: left;width: 100px;height: 27px;margin: 10px;paddin…

Echarts中饼状图label标签文本重叠

解决方式&#xff1a; 1. 未使用formatter&#xff0c;不使用formatter的情况下label重叠主要是没有设置 第一步&#xff1a;调整fontSize文字的显示大小&#xff0c;字越小就越不会重叠&#xff1b; 第二步&#xff1a;设置最小扇区角度&#xff0c;minAngle&#xff08;最小…

关于 Qt在windows使用mingw32编译器时从Qt5.9切换至Qt5.12出现“C2001:常量中有换行符“不修改编码 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/131901444 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

vue事件绑定、事件参数、事件修饰符、表单双向绑定、监听器、计算属性

目录 事件绑定 事件参数 事件修饰符 表单 watch(监听器 监听属性) computed&#xff08;计算属性&#xff09; 面试题 事件机制 概述 在dom阶段&#xff0c;我们已经讲述了事件机制的特点&#xff1a; 事件三要素 事件绑定 事件流 事件对象 事件代理 事件类型 这些…

大语言模型分词的 chunk_size 和 chunk_overlap 说明和验证

大语言模型分词的 chunk_size 和 chunk_overlap 1. 什么是 chunk_size 和 chunk_overlap2. 实际验证 1. 什么是 chunk_size 和 chunk_overlap 对于大型语言模型如GPT-3等来说,chunk_size和chunk_overlap通常指的是文本序列的切分参数: chunk_size: 对输入文本序列进行切分的最…

Git简介与工作原理:了解Git的基本概念、版本控制系统和分布式版本控制的工作原理

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…