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

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

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

视频: 《C语言C++学习指南(零基础入门)》课时41 指针的定义和基本使用(编程开发 编程语言 C) 2024
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 ++中 - 虚拟变量

编辑的选择

添加新的SketchUp图层并在图层之间移动实体 - 虚拟图层

添加新的SketchUp图层并在图层之间移动实体 - 虚拟图层

是SketchUp非常有用的一部分,他们可以让你的生活变得更轻松。以下是如何在Sketchup中添加新图层以及如何将实体移动到不同图层的方法。添加新图层按照以下步骤将图层添加到SketchUp文件:选择“窗口”→“图层”。图层...

全部关于地理位置快照和SketchUp - 虚拟

全部关于地理位置快照和SketchUp - 虚拟

当您将地理位置快照导入SketchUp ,您可以访问Google庞大的地理数据存储库;快照不仅仅是漂亮的图片:导入快照地理位置自动定位您的位置。这意味着快照设置您的模型的经纬度,并定位在正确的主要方向。任何阴影研究你...

如何在SketchUp中使用场景动画区域

如何在SketchUp中使用场景动画区域

将区域视图与场景组合在一起以创建动画展示您的SketchUp模型都是一种有用且令人印象深刻的方式。基本的想法是,您可以使用场景来创建动画,其中您的剖面在您的模型中移动。以下是您可能需要使用此技巧的几个原因:如果...

编辑的选择

如何将尼康D5300照片下载到计算机 - 傻瓜

如何将尼康D5300照片下载到计算机 - 傻瓜

你的尼康D5300,你可能会想用他们的照片编辑软件。您可以用两种方法将照相机中的照片和电影文件移到电脑上:通过USB电缆将照相机连接到电脑。您需要的电缆是随附的。

如何在播放期间放大尼康D7100照片 - 虚拟人物

如何在播放期间放大尼康D7100照片 - 虚拟人物

您的尼康D7100,如左图所示,您可以放大它,如右图所示。但是,您只能放大静止照片。此功能不适用于电影。以下是如何使用放大功能:放大。按Qual按钮。您可以...

如何在尼康D7100上播放时隐藏照片 - 虚拟人物

如何在尼康D7100上播放时隐藏照片 - 虚拟人物

可以使用隐藏图像选项在尼康D7100的播放菜单上隐藏一些照片,同时在播放过程中显示其他照片。假设你拍了100张照片--50次在商务会议上,50次在野外会议后。您想向您的老板展示您和您的同事的照片...

编辑的选择

上一次显示一张照片(全屏播放)如何在您的照片上一次显示一张照片(全屏播放)尼康D5300 - 傻瓜

上一次显示一张照片(全屏播放)如何在您的照片上一次显示一张照片(全屏播放)尼康D5300 - 傻瓜

很可能您已经在尼康D5300上播放了播放模式。但是,在数码相机上查看照片有不同的选项。对于正常播放 - 即每次只能查看一张照片 - 请执行以下步骤:

如何自定义尼康D3300的优化校准 - 傻瓜

如何自定义尼康D3300的优化校准 - 傻瓜

当您使用尼康D3300的内置原始处理器,您可以尝试不同的优化校准设置,了解每个设置对图像的影响。当您使用免费的Nikon软件Nikon ViewNX处理图像时,您可以选择相同的选项。该程序的原始转换器,以及在Adobe Photoshop中找到的那些...

如何在HDMI屏幕上显示实时预览预览 - 假人

如何在HDMI屏幕上显示实时预览预览 - 假人

尼康D7100相机连接到HDMI(高清晰度多媒体接口)设备,以在该屏幕上查看实时显示输出。摄影师经常使用此功能,因为摄影师需要比相机显示器提供更大的主题。使用此选项时,会出现一些问题:...