关于C语言中指针和数组的说明【2021.4.24】

Motivation

最近我总是试图利用指针去访问数组或者进行相反的操作,然而结果往往不尽人意。而刚好我又想撰写一篇稍微具有深度一点的文章来表达我的思考,在持续三天(4.20~4.23)的阅读和思考过后,是时候去完成这样一篇博客了。

An introduction

我所阅读的书是鼎鼎有名的《C专家编程》。其中第四章、第八章、第九章持续地讨论了C中的指针何时相同、何时不同、在函数的调用过程中,传递数组和传递指针的区别和本质、多维数组如何作为函数参数等等问题。

What’s the problem?

#The broken program

when I define an array and visit it as a pointer

在这里插入图片描述

When I define a pointer and visit it as an array

在这里插入图片描述

Why?

  1. 指针和数组并不相同。
    访问a[5]对于数组char a[10]=”abcdef”来说,在程序编译阶段,我们就可以得到数组首地址;运行的第一阶段取偏移量5,将10和首地址相加得到要访问的数组元素的地址,运行的第二阶段根据计算得到的地址访问对应元素。
    而对于指针char *p=”abcdef”来说,程序编译阶段,我们首先得到指针变量p的地址,在运行阶段,根据p的地址得到p的内容(也就是p指向的元素的地址),再根据p的内容访问所指向的元素。
    简单来说,因为数组中本身存的是数据,指针中存在的是数据的地址;因此数组直接访问数据,指针间接访问数据。
    因为二者在底层实现逻辑上的不同,导致了混淆使用时的错误。
    在这本书的第四章,作者给出了这样的建议“声明与定义相匹配”。当我们想使用一个数组,就定义一个数组;想使用一个指针,就定义一个指针。
  2. 之所以我们会认为二者可以等同,是因为在大多数的场景之中,我们在使用二者的时候可以互换(尤其是在使用数组的时候用指针替换)。我们被告知当数组作为函数的参数之时,我们既可以传递数组,同时也可以传递数组首个元素的指针;典型例子包括在我以上程序中所使用的printf(“%d ”,p)和puts§。
    在C语言的函数参数传递中,采用的是值传递的方法。简单来说,就是将实参拷贝一份传递给调用的函数。而对于数组这种特殊的庞大的数据结构,对其进行拷贝太浪费时间、空间了,因此在传参的过程中,默认传递数组首个元素的指针。(这里我仅就一维数组进行讨论,因为多维数组的规则有些复杂,作者在书中228页,第10章也有说明)。
    再往前追溯历史,C语言的缔造者们认为数组的存在似乎没有必要,因为数组能做的指针都能做,数组不能做的,指针照样能做。因此对于数组的访问来讲,总可以用指针+对应偏移量来替换。
    例如:
char a[10] = “hello world”;
char *p = a; 
c = a[5]; //第一种方法
c =*(p+5);//第二种方法
c=p[5];//第三种方法
p = a+5; c=*p; //第四种方法 

所得到的c值总是相同的。

Something inward

在阅读的过程中,我愈发能体会到编程的乐趣和快感,也能感受到C语言旺盛的生命力和历史底蕴,也因此感到自己的无知,所以我准备在以后的每一篇博客开启一个sharing的版块来追溯一下C语言的历史。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值