#include <iostream>
using namespace std;
int main(){
//1.1 声明一个数组
// 类型 int 加名字 a 加 [元素数],如果不写元素数,就必须在后面写内容 = {1,2,3,4}; 系统根据内容判断数组大小,此后大小就固定。
int b[3] ;
int c[] = {1,2,3,4};
int a[10] = {1,2,3,4};
// 赋了部分初值的前提下,其余没赋值的都为0。声明了 static 的数组默认值都 0。
注意:在比较老的C++版本里,上面那种方式声明的数组,大小不能是变量,现在基本上都支持用变量。
// 重点概念:数组在内存中顺序存放
// 二维数组,元素在内存中仍线性顺序存放,第一个元素内存中位置最低,维数为常量。
int d[3][4] = {{1,2},{3}};
int e[][4] = {{2,45},{42,5,2,3}}; // 省略了一维的大小
// 这里一维可省大小,二维不可以。否则系统推断不出选哪个做第二维的长度
// 好了,其余的和 java 差不多了,但是有一点,关于数组长度 java 用 length 就解决了,C/C++ 里怎么解决呢?
// 使用数组时,经常涉及到作为参数传递,但一般是参数里同时传递数组大小,因为数组做参数会变为指针。这里肯定现在无法理解,只需记住一点,数组大小,通过参数传递,不要通过计算的方式获取。虽然下面这种计算方法对于数组类型在某些情况下是可以用的。总之记住,数组大小是手动用一个值存储、传递的。以后学到类,vector 类可以获取元素数目。
int len = sizeof(a)/sizeof(int);
// 解释: a 数组在内存中的总大小,除以一个 int 类型的大小(都是byte为单位),就是数组长度了。不要用这个方法。
// 1.3 数组与指针
下文是对指针的预防针,后面有专门的文章说,大致看看即可。
// C/C++中,数组名,就是,数组在内存中存放的首地址!!!!是地址!!!!地址的另一个名字,是指针!!!!
通过这个性质,让指针=数组名,指针+1,就是下一个元素的指针,即下一个元素的地址。
// 下面有个 demo,主要为说明一个问题,数组作为参数传递时,数组名其实是一个地址,地址本质是一个数,数的长度和 long 类型一样长,这个数,就是在内存中的地址。
一个demo:第一张图:(后面有第二张,一起的)
(这里 demo 纯粹为了演示数组与指针,没有在参数里单独传递数组长度)
第二张,最终结果
函数里,a 作为一个数组,一个指针,一个地址数,其实和 b 的值相同,把他们当作一个数。
一般函数声明都是这样的:
void sum(int array[], int lenth); // 长度作为一个参数
或者:
void sum(int *array, int lenth); // 两个声明是等价的,变相说明了:
数组作为参数传递后,本身就不是“数组”了,是一个指针,所以前面提过的计算数组的方法会出问题。
指针有关的,后文会详述