C语言指针和数组的关系

#include<stdio.h>voidmain(){inta[5]={1,2,3,4,5};int*p,i;p=a;for(i=0;i<5;i++)printf("%... #include<stdio.h>
void main()
{
int a[5]={1,2,3,4,5};
int *p,i;
p=a;
for(i=0;i<5;i++)
printf("%d ",p[i]);
printf("\n");
}
请问指针不是存放数组的地址吗,为什么指针能变成数组呢,又没有定义数组p[5]?
指针和数组名都是指向数组首地址,为啥之后指针就可以变成了数组了?一般指针p是像这样指向的 p+i 而不是 p[i]这样啊?后者是第一次见到过,后者可以用吗?
展开
 我来答
ufjnk46
2011-01-15 · TA获得超过1782个赞
知道小有建树答主
回答量:381
采纳率:0%
帮助的人:349万
展开全部
指针和数组是两种不同的数据结构:
指针:逻辑结构是:长整型的类型,表示的是内存地址,它只能存放内存字节的编号,它的意义是表示某个字节在内存中的编号.物理结构是:占四个字节的一个长整型内存空间.特点是:它保存内存地址的编号.
数组:逻辑结构是:由多个并列关系的元素构成,各数组元素之间的地位是平等的.物理结构是:存储在一块连续的内存空间,逻辑相邻的元素存放在相邻的物理单元内.特点是:数组名称同时表示该块内存空间的起始地址,数组元素可以定义为任何数据类型.
栀株暇
2011-01-14 · 超过13用户采纳过TA的回答
知道答主
回答量:60
采纳率:0%
帮助的人:31.6万
展开全部
1.数组是一块连续的内存空间,数组名是内存的首地址,只读常量。
2.数组名与指针的共同点:都是地址,可以用来计算内存的地址和访问内存。
不同点:数组名是常量,不可更改;指针可以赋值也可以更改

在这里,因为把数组的首地址赋值给指针p,那么p就可以操作数组a的指(可以改数组a的值,也可以显示数组a的值)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
simple1129
2011-01-14 · 超过24用户采纳过TA的回答
知道答主
回答量:66
采纳率:0%
帮助的人:46万
展开全部
恩,完全可以用...
这个解释起来,p是指向数组的首地址,因为c 编译器在处理p[i]的时候是这样的: *(p+i),而数组在内存中存放的时候就是一系列连续的项目,所以可以用这种方法访问数组中的元素,p[i]的作用与a[i]的作用是完全一样的。 注意,这不是把指针变成了数组,可以理解成只有一种语法糖衣,不必深究,直接用就行了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
killall2117
2011-01-14 · TA获得超过271个赞
知道小有建树答主
回答量:243
采纳率:0%
帮助的人:172万
展开全部
你定义了p=a,数组名其实就是指针,数组名a指的就是数组元素的第一个元素的地址,你令p=a,
的意思也就是把数组a的首地址赋给了指针p,他俩就可以互换了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Quasimodo2001
2011-01-14 · TA获得超过254个赞
知道小有建树答主
回答量:211
采纳率:0%
帮助的人:203万
展开全部
栀株暇的答案不错
学习数组、指针和地址之间的关系,这是C和C++的基本。关于这个程序的执行顺序是这样的
void main()
{
int a[5]={1,2,3,4,5};
int *p,i;
p=a; //p指向了 a的起始地址,等同于p = &a[0];
for(i=0;i<5;i++)
printf("%d ",p[i]); //相当于指针地址+1,取出的a地址中的内容
printf("\n");
}
//补充说明,数组其实就是指针的一种变形的表达,数组的a[i++],在同类型的定义中等同于p++
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式