c++指针(三)——指针和数组名的关系

这一篇文章揭秘指针和数组名的关系~~~

(1)、数组的定义

int array[10];//定义了一个数组array,并且初始化都为0,数组为{0,0,0,0,0}
int array[10]={1,2};//定义了一个数组array,并且初始化都为0,但是第一,第二个元素又被改写为1和2,最后数组为{1,2,0,0,0}
int array[];//该定义错误,没有指定需要多少的内存空间,系统无法分配空间

定义一个数组时的内存分配是不是也和定义一个int型数据或者定义一个char型字符时的内存分配一样呢?

大体是一样的,当定义一个数组时,系统为这个数组分配 n*sizeof(int) 个字节的内存空间(n为数组的长度),并且我们给这个数组起了一个名字array,但是当我们执行下边的语句

cout<<array<<endl;

输出的并不是整个数组,而是一个十六进制的数。这说明array并不代表这个数组整个内存空间,array是一个地址

当我们取这个地址中的内容时,发现 *array 是数组中的第一个数字

cout<<*array<<endl;//输出数组中的第一个数字

所以array有两层含义:

1、这个数组的名字

2、一个地址,这个地址就是系统分配给这个数组的内存空间的首地址(也就是数组中第一个数字的地址),那么 *array 就代表数组中的第一个数,如果数组定义为int array[10]={1,2,3,4,5,6,7,8,9,0}, 那么 *array 就等于1

为什么会这样呢?为什么定义int变量 a 后,a就代表内容,定义数组 array 后,array 就代表地址了呢?

可以这么理解,定义 int 变量的时候,变量代表的只是一个数据单位(一个数啦,一个字符啦),我们通过使用 a 就可以得到具体的数据,从而加加减减,很方便吧~;相反,如果我们把 a 也定义为像数组一样是个地址,那么每次我们取这个数字都要 *a 才能取到数字,好麻烦有没有~~~~~

但是定义数组的时候,里边有好多数啊,如果我们使用 array 就得到了一串的所有的数字,而我们想要用其中的第一个数字,第二个数字等等就没办法得到了,怎么加加减减,我们想要得到的是一个数呀;再者,如果 array 代表数组的首地址,*array就得到了第一个数字,然后通过首地址 array 计算第二个数字,第三个数字,第四个数字等等的地址(array+1, array+2, array+3 等等),然后 *(array+i) 就得到数组中所有的数字啦,很方便有没有~~~,要是 array 代表的是第一个数字的内容,取第二个数字的时候要对 array 先进行取地址 &array,再进行地址运算 (&array+i),再根据地址取数字 (*(&array+i)) ,很麻烦有没有 ~~~~~

 (2)、数组名和指针遍历数组

最直接访问数组元素的方法

int array[10]={1,2,3,4,5,6,7,8,9,0};
for(int i=0;i<10;i++){
    cout<<array[i]<<endl;
}

我们也可以这样

for(int i=0;i<10;i++){
    cout<<*(array+i)<<endl;
}

也可以这样

int *p;
p=array;
for(int i=0;i<10;i++){
    cout<<p[i]<<endl;
}

还可以这样

int *p;
p=array;
for(int i=0;i<10;i++){
    cout<<*(p+i)<<endl;
}

但是指针和数组名在任何情况下都相同吗?

请看下面两段代码

int *p;
p=array;
for(int i=0;i<10;i++){
    cout<<*p<<endl;
    p++;
}

上边这段代码得到了正确的结果

然而下边这段代码就会出错

for(int i=0;i<10;i++){
    cout<<*array<<endl;
    array++;
}

为什么呢,因为 array 是一个指针常量,它的值是不能修改的,array一直指向系统为数组分配的内存空间的首地址;而p是一个指针变量,可以修改~~~~~

有关指针常量与常量指针的内容请参考下一篇文章~~~指针常量与常量指针

猜你喜欢

转载自blog.csdn.net/qq_32103261/article/details/80225500
今日推荐