外包小程序开发的价格/百度排名优化咨询电话

外包小程序开发的价格,百度排名优化咨询电话,平台网站很难做,北京商务网站建设前言在C语言中,数组和指针似乎总是“暧昧不清”,有时候很容易把它们混淆。本文就来理一理数组和指针之间到底有哪些异同。数组回顾在分析之前,我们不妨回顾一下数组的知识。数组是可以存储一个固定大小的相同类型元素的顺序集合。为了便于我们…

前言

在C语言中,数组和指针似乎总是“暧昧不清”,有时候很容易把它们混淆。本文就来理一理数组和指针之间到底有哪些异同。

数组回顾

在分析之前,我们不妨回顾一下数组的知识。数组是可以存储一个固定大小的相同类型元素的顺序集合。为了便于我们说明,假设有以下数组声明:

int a[5];
char b[] = "hello";
  • 数组大小必须在编译期就作为一个常数确定下来。

  • 但C99中引入了变长数组,允许数组的维度是表达式 ,但在数组分配内存时,其表达式的值可以被求出。

  • 数组下标运算实际上都是通过指针进行的,也就是说a[4]与*(a 4)是等价的,甚至你会发现和4[a]也是一样的。

  • 数组名一般代表了指向该数组下标为0的元素的指针,并且printf("%s\n",hello)与printf("%s\n",&hello[0])等效。

数组和指针不相等

考虑下面的声明:

int c[4];//假设int占4字节
int *d;

对于上面的声明,编译器会给c预留内存空间4*4字节,并且数组名代表着指向数组第一个元素的指针。但对于d,却只为指针本身保留了内存空间。
所以此时有下面的操作:

c[3];        //合法
*(c 3);      //合法
*d;          //不合法,d指向了内存中不确定位置
c  ;        //不合法,一维数组名是指针常量,常量不能被修改掉
d  ;        //可通过编译

另外,下面的两种情况也是不一样的:

char c[] = "hello";
char *d = "hello";

前者对字符数组a进行了初始化,后者将d指向了字符串常量。字符串常量存储在只读区,因此有下面的操作:

 c[0] = 'H';  //合法,可修改数组内容*d = 'H';    //不合法,字符串常量内容不可更改d[0] = 'H'   //不合法

数组名的含义

绝大多数情况,数组名都代表着指向该数组中下标为0的元素的指针,但是有例外:

int e[4];//假设int为4字节
sizeof(e);

上面的sizeof(e)的值并非4或8(指针占用空间),而是4*4 = 16。也就是说,当数组名被用作运算符sizeof的参数时,它的计算结果是整个数组的大小,而非第一个元素的指针大小。
再来看下面这种情况:

int temp[5];
char *p = &temp;
char *q = temp;

在这里,p和q的值是一样的,含义却不一样,前者是指向数组的指针,而后者是指向该数组中下标为0的元素的指针。因此p 1指向了temp的末尾,而q 1指向了temp的第2个元素。

数组长度计算

如何计算数组长度?考虑下面的代码:

int f[] = {1,2,3,4,5,6};
int *g = f;
size_t len_f = sizeof(f)/sizeof(int)//正确计算方法
size_t len_g = sizeof(g)/sizeof(int)

上面的len_f和len_g的值相等吗?显然并不相等。事实上,只有len_f得到了数组f的长度,而len_g的值并没有任何实际意义。

不能作为参数的数组

所谓的数组不能作为参数,并不是指声明的数组不能作为参数传递,而是指当数组名作为参数时,数组名会被转换为指向该数组下标为0的元素的指针。
而下面的两种声明,其实也是等效的:

size_t arrayLen(const int *arr);
size_t arrayLen(const int arr[]);

我们来看一个例子,说明数组作为参数的情况:

#include 
int arraySum(const int arr[])
{unsigned int loop = 0;/*循环前计算好长度,提高性能*/unsigned int len = sizeof(arr)/sizeof(int);int sum = 0;if(NULL == arr){return 0;}for(loop = 0; loop < len; loop  ){sum =arr[loop];}return sum;   
}
int main(void)
{int a[] = {1,2,3,4,5,6};int sum = arraySum(a);printf("arr sum is %d",sum);return 0;
}

我们运行上面的程序,发现最终结果并不是我们预期的21,而是3。问题在于,a作为参数传入到arraySum中时,它是作为指针的,那么在函数内部计算sizeof(arr)自然只是得到了指针占用的内存大小。对于64位程序,这个大小是8,那么len的值为2,最终只计算了两个元素的和。

思考:该如何修改上面的程序才能得到正确的结果?

总结

我们来总结一下前面的核心内容:

  • 数组下标运算实际上都是通过指针进行的。

  • 数组名代表着指向该数组中下标为0的元素的指针,但有例外:sizeof(数组名)返回整个数组的大小,而非指针大小;&数组名返回一个指向数组的指针,而不是指向该数组中下标为0的元素的指针的指针。

  • 数组名作为参数时,数组名会被转换成指向该数组下标为0的元素的指针。

  • 指针操作可能比下标操作效率高,但可维护性却不一定有下标操作好。

  • 数组和指针不相等。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

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

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

相关文章

python生成uuid_咸鱼高赞回答:有什么相见恨晚的Python技巧,附赠python最新教程...

日常工作几乎离不python。一路走来&#xff0c;他积累了不少有用的技巧和tips&#xff0c;现在就将这些技巧分享给大家。这些技巧将根据其首字母按A-Z的顺序进行展示。Python相关学习资料获取方式&#xff1a;转发文章关注私信【Python】ALL OR ANYPython之所以成为这么一门受欢…

java用十字链表实现无向图_实验四:图的实现与应用

20162317袁逸灏 实验四&#xff1a;图的实现与应用实验内容用邻接矩阵十字链表实现无向图中的添加结点删除结点添加边删除边size()isEmpty()广度优先迭代器深度优先迭代器方法实验要求实验1&#xff1a;用邻接矩阵实现无向图(边和顶点都要保存)&#xff0c;实现在包含添加和删除…

C语言指针变量的运算

前言指针变量也是可以进行运算的&#xff0c;如指针变量对其自身加上某个整数或减去某个整数&#xff0c;这在内存上体现为&#xff1a;相对这个指针向后偏移多少个单位或向前偏移了多少个单位&#xff0c;这里的单位与指针变量的类型有关。在32bit环境下&#xff0c;int类型占…

关于n对角矩阵数据结构_机器学习与线性代数 - 特殊矩阵

在线性代数中&#xff0c;有一些特殊的矩阵具有易于分析和操作的特性。它们的特征向量可能具有特定的特征值或特殊关系。还有一些方法可以将一个矩阵分解成这些“更简单”的矩阵。操作复杂性的降低提高了可伸缩性。然而&#xff0c;即使这些矩阵都是特殊的&#xff0c;它们也不…

C语言内存/指针相关

内存数据类型–更好的内存管理数据类型&#xff1a;固定大小内存的别名typedef结构体的别名 typedef struct Student MyStudent给指针起别名 typedef char * PCHAR给变量起别名 typedef longlong mylong_t注意&#xff1a;void类型不能typedefvoid只能对函数返回和参数的限定vo…

求杨辉三角的前n行数据_LeetCode算法第118题:杨辉三角

题目描述&#xff1a;给定一个非负整数 numRows&#xff0c;生成杨辉三角的前 numRows 行。在杨辉三角中&#xff0c;每个数是它左上方和右上方的数的和。示例:输入: 5输出:[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1]]思路&#xff1a;杨辉三角形有如下两个特性每一行的第…

jasmine单元测试_使用Jasmine,Spock和Nashorn测试JVM服务器端JavaScript

jasmine单元测试JavaScript使用不仅限于浏览器中的客户端代码或NodeJS支持的服务器端代码。 许多基于JVM的项目都将其用作内部脚本语言。 测试这种功能既不简单也不标准。 在本文中&#xff0c;我打算演示一种使用成熟的工具&#xff08;例如Jasmine &#xff0c; Spock和Nasho…

常用于单片机的接口适配器模式C语言实现

一般实现在我们做项目的时候&#xff0c;一般的实现&#xff0c;可能我们会这样写代码// FileName: test.c// 来源&#xff1a;公众号【技术让梦想更伟大】#include#include “ExternModule.h” int main(void){/*初始化*/ vAllInit(); while(1) { /*项目逻辑*/ vLo…

ar面部识别_国内手机厂商AR布局报告

欢迎关注AIRX的B站官方账号&#xff1a;AIRX社区&#xff0c;我们会定期和一些ARVR、AI企业和高校合作直播&#xff0c;分享前沿ARVR、AI、Unity、Unreal技术和教程。招运营、UI设计志愿者进行时&#xff0c;我们期待您的加入&#xff5e;文章来源 &#xff1a;增强现实核心技术…

rest服务swagger_在Java EE 7上骑骆驼–带有Swagger文档的REST服务

rest服务swagger骆驼开箱即用。 Swagger集成就是其中之一。 不幸的是&#xff0c;大多数已经存在的功能都严重依赖于Spring。 但这并不能阻止我们在普通的Java EE 7应用程序中使用它们&#xff0c;因为有时它只是更轻量级的处理方式。 但是我不想再对此进行讨论。 相反&#xf…

知识贴!单片机C语言编程之.H文件与.C文件的关系

一、.H文件与.C文件的关系&#xff1a;迄今为止&#xff0c;写过的程序都是一些很简单的程序&#xff0c;从来没有想到要自己写.H文件&#xff0c;也不知道.H文件到底什么用&#xff0c;与.C文件什么关系。只是最近写键盘程序&#xff0c;参考别人的程序时&#xff0c;发现别人…

vector怎么按字段查询顺序输出_7大查询匹配类函数,一次给你总结好

Excel数据处理中&#xff0c;经常用到各种函数&#xff0c;可以说函数是Excel必不可少的一部分&#xff0c;今天向大家介绍数据处理中的七个查询匹配函数。下面一一介绍各函数的具体用法。vlookup功能&#xff1a;搜索表区域首列满足条件的元素&#xff0c;确定待检索单元格在区…

信工干货||C语言中的运算符和表达式

C语言中的运算符和表达式1算术运算符及表达式&#xff08;1&#xff09;算术运算符包括&#xff1a; &#xff0c;-&#xff0c;*&#xff0c;/&#xff0c;%。&#xff08;2&#xff09;*&#xff0c;/&#xff0c;%同级&#xff0c;比 &#xff0c;-高。&#xff08;3&#x…

3皮卡丘眨眼代码_活见久,皮卡丘居然是一门编程语言

我很荣幸地向你介绍皮卡神教的编程语言&#xff0c;这门语言专为皮神设计(认真脸)。为什么一定要学习这门语言呢——谁不想要只皮卡丘我问你&#xff1f;在当今的宝可梦就业环境中&#xff0c;大多数皮卡丘们都在残忍的宝可梦训练师手下过着顺从和被奴役的生活。他们经常被迫与…

C语言关系运算符详解

关系运算符在使用时&#xff0c;它的的两边都会有一个表达式&#xff0c;比如变量、数值、加减乘除运算等&#xff0c;关系运算符的作用就是判明这两个表达式的大小关系。注意&#xff0c;是判明大小关系&#xff0c;不是其他关系。C语言提供了以下关系运算符&#xff1a;关系运…

jboss fuse 教程_IDC关于使用JBoss Fuse的商业价值的报告(与Apache Camel一起使用)

jboss fuse 教程这只是一篇博客文章&#xff0c;具有更多的商业性质&#xff0c;但是您不能一无所有。 实际上&#xff0c;这也是使Apache Camel保持活力并保持良好状态的原因&#xff0c;这还归功于其商业上的成功。 希望从JBoss Fuse之类的产品中寻找有关在商业上使用Apache…

嵌入式软件架构设计分层思路

在正规的项目开发中&#xff0c;项目往往是并行开发的&#xff0c;也就是说硬件设计、底层软件设计、应用软件设计等是同步进行的。比如说在开发板上调试模块驱动&#xff0c;在其他平台上调试应用程序再移植到目前这个平台等。嵌入式专栏1为什么很少看见嵌入式软件架构师职位在…

C语言函数返回1和返回0究竟哪个好?

基本上&#xff0c;没有人会将大段的C语言代码全部塞入 main() 函数。更好的做法是按照复用率高、耦合性低的原则&#xff0c;尽可能的将代码拆分不同的功能模块&#xff0c;并封装成函数。C语言代码的组合千变万化&#xff0c;因此函数的功能可能会比较复杂&#xff0c;不同的…

乐高ev3搭建图_乐高EV3第一讲,Hello Ev3,搭建机甲战神模型

课程主题认识编程及结构。课程目标1.简单认识 Ev3 的硬件及使用2.学习 Ev3主控自带的功能(最好拿控制器给孩子演示讲解)联系同学们好&#xff01;从今天开始我们就要进入乐高 EV3的世界&#xff0c;制作更多更酷、更好玩的机器人了&#xff01;首先老师先来问大家几个基本的问题…

对单片机C语言的一些误用和总结

我觉得语言之所以能称之为语言&#xff0c;它肯定是一种工具一种相互交流相互通信相互传达之间的意图的工具&#xff0c;作为语言那肯定得有自己的语法&#xff0c;要想相互交流肯定得先学好它的语法吧(比如像表达式&#xff0c;函数&#xff0c;循环&#xff0c;指针)我称之为…