视频: 《C语言C++学习指南(零基础入门)》课时41 指针的定义和基本使用(编程开发 编程语言 C) 2024
数组的名字是指向数组本身的指针。 数组 是存储在内存中的一系列变量。 数组名称 指向第一个项目。
这是关于指针的一个有趣的问题:你可以有一个函数头,比如下面这行,只要用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行打印。
指针和数组!但是,如果你声明一个没有数组大小的函数头,比如
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]; 。