个人理财 数组和指针C ++中 - 虚拟变量

数组和指针C ++中 - 虚拟变量

视频: 《C语言C++学习指南(零基础入门)》课时41 指针的定义和基本使用(编程开发 编程语言 C) 2025

视频: 《C语言C++学习指南(零基础入门)》课时41 指针的定义和基本使用(编程开发 编程语言 C) 2025
Anonim

数组的名字是指向数组本身的指针。 数组 是存储在内存中的一系列变量。 数组名称 指向第一个项目。

这是关于指针的一个有趣的问题:你可以有一个函数头,比如下面这行,只要用sizeof来确定数组中有多少个元素?如果是这样,这个函数不需要调用者指定数组的大小。

<!考虑在Array01示例中找到的这个函数和一个调用它的main():void ProcessArray(int Numbers []){ cout <<“里面的函数:字节大小是”<< sizeof(Numbers)<< endl;} int main(int argc,char * argv []){int MyNumbers [] = {1,2,3,4, 5,6,7,8,9,10}; cout <<“外部函数:字节大小是”; cout << sizeof(MyNumbers)<< endl; ProcessArray(通过myNumbers);返回0;}
当你运行这个应用程序,这是你看到的:

外部函数:字节大小为40内部函数:字节大小为4

在函数外,代码知道数组的大小是40字节。但是为什么代码在数组里面后认为大小是4呢?原因是,即使看起来你正在传递一个数组,你真的将一个

指针
传递给一个数组。指针的大小只有4,所以这就是最后的cout行打印。

声明数组有轻微的特质。当你通过给定数量的元素来声明一个数组时,比如 int MyNumbers [5];编译器知道你有一个数组,sizeof运算符给你整个数组的大小。数组名称是

,都是

指针和数组!但是,如果你声明一个没有数组大小的函数头,比如

void ProcessArray(int Numbers []){

,编译器将它视为一个简单的 指针 。最后一行实际上等同于以下行:

void ProcessArray(int * Numbers){

因此,在任一行声明的函数中,以下两行代码都是 : 数字[3] = 10; *(Numbers + 3)= 10;

这个等价意味着如果你在一个数组上使用一个extern声明,比如

extern int MyNumbers []; 然后取这个数组的大小,编译器会感到困惑。这里有一个例子:如果你有两个文件,数字。 CPP和主要。 CPP,其中数字。 cpp声明一个数组和main。 cpp从外部声明它(如Array02示例中所示),如果调用sizeof,则会发生编译器错误: #include using namespace std; extern int MyNumbers []; int main(int argc,char * argv []){cout << sizeof(MyNumbers)<< endl;返回0;}

在代码::块,gcc编译器给我们这个错误:

错误:'sizeof'的不适用应用到不完整的类型'int []'

解决方法是把大小括号内的数组。只要确保大小与其他源代码文件相同!您可以通过更改编号来伪造编译器,而您

不会收到错误

。但这是不好的编程风格,只是要求错误。

尽管一个

数组

只是一个在内存中彼此相邻的变量序列,但数组的 名称 实际上只是指向数组中第一个元素的指针。您可以使用该名称作为指针。但是,只有在确实需要使用指针时才能这样做。毕竟,你真的没有理由编写那些含糊不清的代码,比如*(Numbers + 3)= 10; 。

反过来也是如此。看看这个函数:void ProcessArray(int * Numbers){cout << numbers [1] << endl;} 这个函数接受一个指针作为参数,但是你可以以数组的形式访问它。再次,不要这样写代码;相反,你应该明白为什么像这样的代码工作 。这样,您就可以深入了解数组以及它们如何在计算机内部生存,而这些知识又可以帮助您编写正确工作的代码。 尽管数组名称只是一个指针,但是整数数组的名称与指向整数的指针并不完全相同。看看这些代码行(在Array03例子中): int LotsONumbers [50]; int x; LotsONumbers =&x;

将LotsONumbers

指针

指向不同的东西:声明为整数的东西。编译器不会让你这样做;你得到一个错误。如果LotsONumbers被声明为int * LotsONumbers,情况就不会如此。那么这个代码将工作。但正如所写,这段代码给你一个编译器错误。不管你信不信,这里是Code::Blocks: 中的编译器错误:错误:赋值'int *'到'int [50]'的不兼容类型' 这个错误意味着编译器看到这两种类型有明确的区别,int *和int []。尽管如此,数组的名字确实是一个指针,你可以把它作为一个使用;你不能用它做任何事情,你可以用一个普通的指针,比如重新分配它。

使用数组时,请注意以下提示。这些将帮助您保持阵列无缺陷:

保持代码一致。例如,如果声明了一个指向整数的指针,请不要将其视为数组。

保持您的代码清晰易懂。如果你传递了指针,那么可以取第一个元素的地址,就像&(MyNumbers [0]),如果这使得代码更清晰 - 虽然它只是MyNumbers。 当你声明一个数组的时候,总是试着在括号内放一个数字,除非你正在编写一个带数组的函数。 使用extern关键字声明数组时,请继续,并将数组大小置于括号内。但要一致!不要一次使用一个号码,另外使用一个不同的号码。最简单的方法是使用一个常量,如const int ArraySize = 10;在一个通用的头文件中,然后在你的数组声明中使用它:int MyArray [ArraySize]; 。

数组和指针C ++中 - 虚拟变量

编辑的选择

Sql数据类型 - 虚拟

Sql数据类型 - 虚拟

这里是ISO / IEC标准SQL识别的所有形式数据类型的列表。除此之外,您可以定义从这些派生的其他数据类型。精确数字:INTEGER SMALLINT BIGINT NUMERIC DECIMAL近似数字:REAL DOUBLE PRECISION FLOAT二进制字符串:BINARY BINARY VARYING BINARY LARGE OBJECT布尔值:BOOLEAN字符串:CHARACTER ...

SQL WHERE子句谓词 - 虚拟子

SQL WHERE子句谓词 - 虚拟子

谓词归结为TRUE或FALSE结果。您可以通过应用WHERE子句(其谓词排除不需要的行)来从SQL查询的结果中筛选出不需要的行。比较谓词=等于 不等于 小于等于>大于> =大于...

编辑的选择

如何在QuickBooks 2014电子邮件发票 - 傻瓜

如何在QuickBooks 2014电子邮件发票 - 傻瓜

您可以通过电子邮件发票QuickBooks的。要做到这一点,请点击电子邮件按钮,它出现在主选项卡的创建发票屏幕的顶部。当QuickBooks显示“发送发票”对话框时,指定要使用哪个电子邮件帐户(网络邮件,电子邮件应用程序(例如Microsoft Outlook)或...

如何在QuickBooks 2010中输入帐单 - 傻瓜

如何在QuickBooks 2010中输入帐单 - 傻瓜

如果您在设置过程中告诉QuickBooks您要跟踪未付帐单(也称为应付帐款),您可以在收到帐单时输入帐单。当你这样做时,QuickBooks会跟踪未付帐单。如果您以前没有在QuickBooks中记录过物品收据如果您输入的钞票是...

如何在QuickBooks Online中输入帐单 - 虚拟币

如何在QuickBooks Online中输入帐单 - 虚拟币

输入您从供应商处收到的帐单QuickBook Online的帐单交易。 QBO跟踪账单作为应付款项,这是您的业务的责任 - 您欠的钱,但尚未支付。大多数进行账单交易的公司都是这样做的,因为他们收到了相当数量的账单,并且...

编辑的选择

虚拟主机常见的电子邮件问题 - 虚拟人物

虚拟主机常见的电子邮件问题 - 虚拟人物

最大最简单的方法发现您的网站托管电子邮件存在问题时,您尝试拿起您的新邮件,发现您长时间没有收到任何邮件。这不是一个科学的方法,但不接收电子邮件,或从其他人那里得到的报告...

如何备份您的虚拟主机数据库 - 虚拟机

如何备份您的虚拟主机数据库 - 虚拟机

使数据库备份成为优先事项。在发生损坏或丢失的情况下,可以轻松地重新创建网站设计,但是数据库中的数据更难重建,除非您有一个好的备份。您的主机可能已经将您的数据库备份为其数据库的一部分...

为您的网站和店面找到一个主机 - 傻瓜

为您的网站和店面找到一个主机 - 傻瓜

计划阶段,寻找您的网站的主机,您的博客,以及您设置销售您的产品的任何店面是一个基本要求。您可以设置多种托管服务的商店,从拍卖网站到网上商城到您自己的互联网服务...