指针与数组名

来源:互联网 发布:java编写99乘法表对齐 编辑:程序博客网 时间:2024/03/28 22:10

      1. 通过数组名访问数组元素

看下面代码:

   int i, a[] = {3,4,5,6,7,3,7,4,4,6};

   for (i = 0; i <= 9; i++)

   {

     printf("%d\n", a[i]);

   }

很显然,它是显示 a 数组的各元素值。 我们还可以这样访问元素,如下:
int i,a[] = {3,4,5,6,7,3,7,4,4,6}; for (i = 0; i <= 9; i++)
{

     printf("%d\n", *(a+i));

   }

  它的结果和作用完全一样。

 

      2.通过指针访问数组元素

int i,*pa, a[] = {3,4,5,6,7,3,7,4,4,6}; pa = a; /*请注意数组名 a 直接赋值给指针 pa*/

for (i =0; i <= 9; i++)

{

     printf("%d\n", pa[i]);

}


很显然,它也是显示 a 数组的各元素值。 另外与数组名一样也可如下:
int i, *pa, a[] = {3,4,5,6,7,3,7,4,4,6}; pa = a;


for (i =0; i <= 9; i++)
{

     printf("%d\n", *(pa+i));

 }

看 pa = a,即数组名赋值给指针,以及通过数组名、指针对元素的访问形 式看,它们并没有什么区别,从这里可以看出:数组名其实也就是指针。难道它 们没有任何区别?有,请继续。

      3.数组名与指针变量的区别

请看下面的代码:

   int i, *pa, a[] = {3,4,5,6,7,3,7,4,4,6};

   pa = a;

   for (i = 0; i <= 9; i++)

   {

      printf("%d\n", *pa);

pa++; /*注意这里,指针值被修改*/

}

可以看出,这段代码也是将数组各元素值输出。不过,你把循环体{}中的 pa改成 a 试试。你会发现程序编译出错,不能成功。看来指针和数组名还是不同的。 其实上面的指针是指针变量,而数组名只是一个指针常量。这个代码与上面的代码不同的是,指针 pa 在整个循环中,其值是不断递增的,即指针值被修改了。 数组名是指针常量,其值是不能修改的,因此不能类似这样操作:a++。

前面 4、5 节中 pa[i],*(pa+i)处,指针pa 的值是使终没有改变。所以 变量指针 pa 与数组名 a 可以互换。

 

      4.声明指针常量

再请看下面的代码:

int i,a[] = {3,4,5,6,7,3,7,4,4,6};
int *const pa = a; /* 注意 const 的位置:不是 const int *pa */ for(i = 0; i <= 9; i++)
{

     printf("%d\n", *pa);

pa++ ;/*注意这里,指针值被修改*/ }

这时候的代码能成功编译吗?不能。因为 pa 指针被定义为常量指针了。这 时与数组名a 已经没有不同。这更说明了数组名就是常量指针。但是......

int*const a = {3,4,5,6,7,3,7,4,4,6}; /*不行*/

inta[]={3,4,5,6,7,3,7,4,4,6}; /*可以,所以初始化数组时必定 要这样。*/

以上都是在 VC6.0上实验。

0 0
原创粉丝点击