C语言第二十四弹---指针(八)

个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】

指针

1、数组和指针笔试题解析

 1.1、字符数组

1.1.1、代码1:

1.1.2、代码2:

1.1.3、代码3:

1.1.4、代码4:

1.1.5、代码5:

1.1.6、代码6:

总结


1、数组和指针笔试题解析

 1.1、字符数组

   1.1.1、代码1:

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));

char arr[] = {'a','b','c','d','e','f'};

//单引号初始化的字符数组,有几个字符则实际存储几个字符,数组内容有"abcdef"
printf("%d\n", sizeof(arr));

//数组名单独放在sizeof内部,代表整个数组,因此为6字节。
printf("%d\n", sizeof(arr+0));

//数组名表示首元素地址,+0还是首元素地址,实质是地址,在x64环境为8字节,x86环境为4字节。
printf("%d\n", sizeof(*arr));

//数组名为首元素地址,解引用为首元素,类型为char,因此大小为1字节。
printf("%d\n", sizeof(arr[1]));

//arr[1]为第二个元素,类型为char,因此大小为1字节。
printf("%d\n", sizeof(&arr));

//&arr为整个数组地址,但是实质还是地址,在x64环境为8字节,x86环境为4字节。
printf("%d\n", sizeof(&arr+1));

//&arr为整个数组地址,+1则走数组大小步,但是实质还是地址,在x64环境为8字节,x86环境为4字节。
printf("%d\n", sizeof(&arr[0]+1));

//arr[0]为第一个元素,&arr为第一个元素地址,+1则走char类型步,但是实质是地址,x64环境为8字节,x86环境为4字节。

1.1.2、代码2:

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));

strlen计算的是'\0'之前的字符个数,参数为指针。

size_t strlen ( const char * str );

char arr[] = {'a','b','c','d','e','f'};

//单引号初始化的字符数组,有几个字符则实际存储几个字符,数组内容有"abcdef"
printf("%d\n", strlen(arr));

//arr为数组首元素地址,在数组初始化中没有'\0',但是strlen会一直执行,直到找到'\0'才停止计算,因此该值为大于等于字符串长度6的随机值。
printf("%d\n", strlen(arr+0));

//arr为数组首元素地址,arr+0还是首元素地址,在数组初始化中没有'\0',但是strlen会一直执行,直到找到'\0'才停止计算,因此该值为大于等于字符串长度6的随机值。
printf("%d\n", strlen(*arr));

//arr为首元素地址,*arr为数组第一个元素,但是函数参数要求为指针,此处为char类型的值,因此该代码错误。
printf("%d\n", strlen(arr[1]));

//arr[1]为第二个元素,但是函数参数要求为指针,此处为char类型的值,因此该代码错误。
printf("%d\n", strlen(&arr));

//&arr为整个数组地址,但是该地址的值还是首元素地址的值,在数组初始化中没有'\0',但是strlen会一直执行,直到找到'\0'才停止计算,因此该值为大于等于字符串长度6的随机值。
printf("%d\n", strlen(&arr+1));

//&arr为整个数组地址,+1则走整个数组大小步,但是我们并不知道'\0'的位置,因此该值为大于等于字符串长度6的随机值。
printf("%d\n", strlen(&arr[0]+1));

//&arr[0]为第一个元素地址,+1则为第二个元素地址,在数组初始化中没有'\0',但是strlen会一直执行,直到找到'\0'才停止计算,因此该值为大于等于字符串长度6的随机值。

注:想要得到结果,需要注释掉其中两个错误代码,否则会引发下面的异常。

代码2运行结果及分析:

1.1.3、代码3:

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));

char arr[] = "abcdef";

//双引号包裹的字符串在末尾会自动加'\0',因此字符串实际的内容有abcdef\0。

//sizeof计算的是占用空间大小,大小为字节。
printf("%d\n", sizeof(arr));

//数组名arr单独放在sizeof内部代表整个数组大小,因此为7字节(\0占用一个字节)。
printf("%d\n", sizeof(arr+0));

//数组名arr不是单独放在sizeof内部,表示首元素地址,+0还是首元素地址,在x86环境下为4字节,x64环境为8字节。
printf("%d\n", sizeof(*arr));

//数组名arr不是单独放在sizeof内部,表示首元素地址,*arr为首元素,类型为char,因此为1字节。
printf("%d\n", sizeof(arr[1]));

//arr[1]为第二个元素,类型为char,因此为1字节。
printf("%d\n", sizeof(&arr));

//&arr为整个数组的地址,但是实质还是地址,在x86环境下为4字节,x64环境为8字节。
printf("%d\n", sizeof(&arr+1));

//&arr为整个数组的地址,+1则走整个数组大小步,但是实质还是地址,在x86环境下为4字节,x64环境为8字节。
printf("%d\n", sizeof(&arr[0]+1));

//&arr[0]为首元素地址,+1则走一个char类型大小步,即为第二个元素地址,在x86环境下为4字节,x64环境为8字节。

1.1.4、代码4:

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));

char arr[] = "abcdef";

//双引号包裹的字符串在末尾会自动加'\0',因此字符串实际的内容有abcdef\0

//strlen计算的是'\0'之前的字符个数,需要包含头文件#include<string.h>

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

//数组名arr为数组首元素地址,首元素到'\0'之间有6个元素,因此长度为6。
printf("%d\n", strlen(arr+0));

//数组名arr为数组首元素地址,+0还是首元素地址,首元素到'\0'之间有6个元素,因此长度为6。
printf("%d\n", strlen(*arr));

//数组名arr为数组首元素地址,*arr为首元素,但是函数的参数为指针,参数不匹配,因此该代码错误。
printf("%d\n", strlen(arr[1]));

//arr[1]为第二个元素,但是函数参数为指针,参数不匹配,因此该代码错误。
printf("%d\n", strlen(&arr));

//&arr为整个数组地址,地址的值为首元素地址的值,首元素到'\0'之间有6个元素,因此长度为6.
printf("%d\n", strlen(&arr+1));

//&arr为整个数组地址,+1则走整个数组大小步,此时不知道'\0'在什么位置,因此为随机值。
printf("%d\n", strlen(&arr[0]+1));

//&arr[0]为首元素地址,+1位第二个元素地址,第二个元素到'\0'之间有5个元素,因此长度为5。

注:想要得到结果,需要注释掉其中两个错误代码。

1.1.5、代码5:

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));

char *p = "abcdef";//此处为字符常量

//p为指针变量,指向字符常量的首元素地址
printf("%d\n", sizeof(p));

//p为指针变量,指向第一个字符,x64环境大小为8字节,x86环境为4字节。
printf("%d\n", sizeof(p+1));

//p为指针变量,p+1同样为指针变量,走char类型大小步,指向第二个字符,x64环境大小为8字节,x86环境为4字节。
printf("%d\n", sizeof(*p));

//p为指针变量,指向第一个字符,*p则为第一个字符,类型为char,因此为1字节。
printf("%d\n", sizeof(p[0]));

//p[0]为第一个字符,类型为char,因此为1字节。
printf("%d\n", sizeof(&p));

//p为指针变量,指向第一个字符,&p为指针变量的地址,x64环境大小为8字节,x86环境为4字节。
printf("%d\n", sizeof(&p+1));

//p为指针变量,指向第一个字符,&p为指针变量的地址,&p+1同样为地址,x64环境大小为8字节,x86环境为4字节。
printf("%d\n", sizeof(&p[0]+1));

//&p[0]为第一个字符的地址,+1位第二个字符的地址,x64环境大小为8字节,x86环境为4字节。

1.1.6、代码6:

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));

char *p = "abcdef";//此处为字符常量

//p为指针变量,指向字符常量的首元素地址

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

//p为指针变量,指向第一个字符,第一个字符到'\0'之间有6个元素,因此长度为6。
printf("%d\n", strlen(p+1));

//p为指针变量,p+1同样为指针变量,走char类型大小步,指向第二个字符,第二个字符到'\0'之间有5个元素,因此长度为5。
printf("%d\n", strlen(*p));

//p为指针变量,指向第一个字符,*p则为第一个字符,但是函数参数为指针,参数不匹配,因此该代码错误。
printf("%d\n", strlen(p[0]));

//p[0]为第一个字符,但是函数参数为指针,参数不匹配,因此该代码错误。
printf("%d\n", strlen(&p));

//p为指针变量,指向第一个字符,&p为指针变量的地址,该地址到'\0'之间不知道有几个元素,因此为随机数。
printf("%d\n", strlen(&p+1));

//p为指针变量,指向第一个字符,&p为指针变量的地址,&p+1同样为地址,该地址到'\0'之间不知道有几个元素,因此为随机数。
printf("%d\n", strlen(&p[0]+1));

//&p[0]为第一个字符的地址,+1位第二个字符的地址,第二个字符到'\0'之间有5个元素,因此长度为5。

 数组名的意义:

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

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

3. 除此之外所有的数组名都表示首元素的地址。

总结


本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!

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

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

相关文章

C++的进阶泛型编程学习(1):函数模板的基本概念和机制

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、模板1.1 模板的概念1.1.1 形象的解释&#xff1a;模板就是通用的模具&#xff0c;目的是提高通用性1.1.1 模板的特点&#xff1a;1.1.2 综述模板的作用 1.2…

OpenGL-ES 学习(1)---- AlphaBlend

AlphaBlend OpenGL-ES 混合本质上是将 2 个片元的颜色进行调和(一般是求和操作)&#xff0c;产生一个新的颜色 OpenGL ES 混合发生在片元通过各项测试之后&#xff0c;准备进入帧缓冲区的片元和原有的片元按照特定比例加权计算出最终片元的颜色值&#xff0c;不再是新&#xf…

Codeforces Round 920 (Div. 3)

D. Very Different Array&#xff08;贪心双指针/前缀和&#xff09; 思路&#xff1a;绝对值就是线段-->让线段最长&#xff08;肯定是越在最短端找最右端的 越最右端找最左端的&#xff09;-->判断怎么连哪段最长(采用双指针的策略去判断&#xff09; &#xff08;左红…

Swift Combine 通过用户输入更新声明式 UI 从入门到精通十五

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

uniapp前端手机获取安全区域css值 防止按键不能被点击

引入 再编写小程序和移动端的时候可能会出现这种情况&#xff0c;页面中的按键刚好才手机中按不到的位置 如下 这是苹果手机的home按键 如果刚好我们的按钮再这个位置,用户是点击不到的 我们就需要一个办法,能够自动的让我们的按键移动到安全可点击的区域 解决 我们可以使用…

第四篇:SQL语法-DDL-数据定义语言

大年初一限定篇&#x1f600; &#xff08;祝广大IT学习者、工作者0 error 0 warning&#xff01;&#xff09; DDL英文全称是Data Definition Language&#xff08;数据定义语言&#xff09;&#xff0c;用来定义关系模式、删除关系、修改关系模式以及创建数据库中的各种对象 …

PHP毕业设计图片分享网站76t17

图片分享网站主要是为了提高工作人员的工作效率和更方便快捷的满足用户&#xff0c;更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户的可操作性&#xff0c;遵循开发的系统优化的原则&#xff0c;…

oppo手机QQ上传文件所在位置

一、打开手机“文件管理”APP 点击“点击查看”&#xff0c;按钮&#xff0c;会进入到新的根目录。 寻找下面的目录进入

《区块链公链数据分析简易速速上手小册》第5章:高级数据分析技术(2024 最新版)

文章目录 5.1 跨链交易分析5.1.1 基础知识5.1.2 重点案例&#xff1a;分析以太坊到 BSC 的跨链交易理论步骤和工具准备Python 代码示例构思步骤1: 设置环境和获取合约信息步骤2: 分析以太坊上的锁定交易步骤3: 跟踪BSC上的铸币交易 结论 5.1.3 拓展案例 1&#xff1a;使用 Pyth…

返回输入字中BIT=1的位个数(博途SCL代码)

返回输入字中BIT1的位个数有很多实际意义&#xff0c;比如我们可以统计同一时间外部的呼叫请求总数、电梯同一时间有多少个请求呼叫等。这里编程我们用到了博途的覆盖指令AT,有关AT指令的其他用法可以参看下面文章链接&#xff1a; https://rxxw-control.blog.csdn.net/articl…

VS Code之Java代码重构和源代码操作

文章目录 支持的代码操作列表调用重构分配变量字段和局部变量的差别Assign statement to new local variable在有参构造函数中将参数指定成一个新的字段 将匿名类转换为嵌套类什么是匿名类&#xff1f;匿名类转换为嵌套类的完整演示 转换为Lambda表达式Lambda 表达式是什么?转…

每日一题(最大连续1的个数,完全数计算)

485. 最大连续 1 的个数 - 力扣&#xff08;LeetCode&#xff09; #include <stdio.h> int findMaxConsecutiveOnes(int* nums, int numsSize) { if (numsSize 0) return 0; // 如果数组为空&#xff0c;返回0 int maxCount 0; // 最大连续1的个数 int currentCo…