回 帖 发 新 帖 刷新版面

主题:[讨论]CC++初学者来吧《我要彻底搞定C指针》第三篇指针与数组名

三.指针与数组名

[b]1. 通过数组名访问数组元素[/b]
看下面代码
int i,a[]={3,4,5,6,7,3,7,4,4,6};
for (i=0;i<=9;i++)
{
   printf ( “%d”, a[i] );
}
很显然,它是显示a 数组的各元素值。
我们还可以这样访问元素,如下
int i,a[]={3,4,5,6,7,3,7,4,4,6};
for (i=0;i<=9;i++)
{
   printf ( “%d”,  *(a+i) );
}
它的结果和作用完全一样

[b]2. 通过指针访问数组元素[/b]
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”, 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”, *(pa+i) );
}
看pa=a即数组名赋值给指针,以及通过数组名、指针对元素的访问形式看,它们并没有什么区别,从这里可以看出数组名其实也就是指针。难道它们没有任何区别?有,请继续。

[b]3. 数组名与指针变量的区别[/b]
请看下面的代码:
int i,*pa,a[]={3,4,5,6,7,3,7,4,4,6};
pa =a;
for (i=0;i<=9;i++)
{
   printf ( “%d”, *pa );
    pa++ ;  //注意这里,指针值被修改
}
可以看出,这段代码也是将数组各元素值输出。不过,你把{}中的pa改成a试试。你会发现程序编译出错,不能成功。看来指针和数组名还是不同的。其实上面的指针是指针变量,而数组名只是一个指针常量。这个代码与上面的代码不同的是,指针pa在整个循环中,其值是不断递增的,即指针值被修改了。数组名是指针常量,其值是不能修改的,因此不能类似这样操作:a++。前面4,5节中pa[i],*(pa+i)处,指针pa的值是使终没有改变。所以变量指针pa与数组名a可以互换。

[b]4. 申明指针常量[/b]
再请看下面的代码:
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”, *pa );
    pa++ ;  //注意这里,指针值被修改
}
这时候的代码能成功编译吗?不能。因为pa指针被定义为常量指针了。这时与数组名a已经没有不同。这更说明了数组名就是常量指针。但是…
int * const a={3,4,5,6,7,3,7,4,4,6};//不行
int a[]={3,4,5,6,7,3,7,4,4,6};//可以,所以初始化数组时必定要这样。
以上都是在VC6.0上实验。

回复列表 (共11个回复)

沙发

瞒好!

板凳

支持楼主写得那么详细

数组表示一个地址
指针表示一个地址的地址

他们不完全相同
至少  sizeof(array) !=  sizeof(ptr);

3 楼

楼上的。
数组名是常量指针。

4 楼

sizeof(array) !=  sizeof(ptr);
确实不一样,不过array还来是指针常量.只不过C语言给它了一些新的特性.给人感觉是array也不是一般申明的指针常量:const int * pi=&arrap.看来C语言的这种模糊的界限也是使得C语言不那么好学的一种原因了.大家还能找出其它不同的情况吗?

[b]非常谢谢各位的指点![/b]

5 楼

终于明白了

6 楼

c语言是很多模糊的,但理解了就懂得它的精妙了

7 楼

既然大家谈论得怎么闹热,我也来一个。嘿嘿,有些人现在还对指针常量和常量指针不是很清楚吧,我来解释一下,看大家还清楚不。
一般看复杂定义都是从右到左,从里到外的原则,比如:
int *p[]; 就应该这样读,首先看标认符p,然后看它的右边是p[],这里说明它是一个数组,再来右边没有了就是左边*p[],这里说明数组里面放的是地址,
再看他的左边int *p[],这里说明它是一个存放int类型变量地址的数组。
现在就来看看下面的问题了。
int const* p;和const int* p1;大家知道他的区别吗?这里有点特殊,
如果从右到左的原则看来它们是不一样的,一个是指正里面的内容是常量,一个是真正本身是常量。他们不一样的,但是这里的定义是不管const再前或在后,它都是先和int先绑定在一起的,所以这两个定义他们是一样的。
如果想指针是常量可以这样,int *const p;

8 楼

[em2]我刚开始学习c语言,对好多地方都不懂,特别是数组和指针的概念很模糊,希望以后你们多多指点。可以发邮件呀!先谢了!

9 楼

我们还可以这样访问元素,如下
int i,a[]={3,4,5,6,7,3,7,4,4,6};
for (i=0;i<=9;i++)
{
   printf ( “%d”,  *(a+i) );
}
它的结果和作用完全一样

a是个指针常量  ,能a+i吗?

10 楼

*(a+i)
a是常量,那只是说a是不能赋新值的,即a 值是不能改变的.
而a+i的表达式并没有改变a本身值

我来回复

您尚未登录,请登录后再回复。点此登录或注册