指针知识(三):指针与数组

数组的概念与指针的概念联系非常解密。其实数组的标识相当于它的第一个元素的地址,如:int a[5],数组名a指向它的第一个元素a[0]的地址。

有语句如下:

int  a[5];
int * p;

下面的赋值为合法的:

p = a;

这里指针p 和a 是等价的,它们有相同的属性,唯一的不同是我们可以给指针p赋其它的数值,而a 总是指向被定义的5个整数组中的第一个。所以,p只是一个普通的指针变量,而与之不同,a 是一个指针常量(constant pointer),数组名的确是一个指针常量。因此虽然前面的赋值表达式是合法的,但下面的不是:

a = p;

因为a 是一个数组(指针常量),常量标识不可以被赋其它数值。

由于变量的特性,以下例子中所有包含指针的表达式都是合法的:

#include <iostream>

using namespace std;

int main()

{

int a[5];
int *p;
p = a;      //p是a[0]的地址,因a指向a的首地址,即指向a[0],
*p = 10;    //即a[0]=10
p++;
*p = 20;      //a[1]=20
p = &a[2];
*p = 30;      //a[2]=30;
p = a +3;
*p = 40;      //a[3]=40
p = a;
*(p+4) = 50;   //a[4]=50

for(int n=0; n<5; n++)
{
cout<<a[n]<<", ";
}
cout<<' ';

}

 
输出:10, 20, 30, 40, 50,

括号[]来指明我们要引用的数组元素的索引(index)。中括号[]也叫位移(offset)操作符,它相当于在指针中的地址上加上括号中的数字。

例如,下面两个表达式互相等价:

a[5] = 0; // a [offset of 5] = 0
*(a+5) = 0; // pointed by (a+5) = 0

不管a 是一个指针还是一个数组名, 这两个表达式都是合法的。

原文地址:https://www.cnblogs.com/guozqzzu/p/3592405.html