c语言 指针与数组的问题。

#include"stdafx.h"#include"conio.h"int_tmain(intargc,_TCHAR*argv[]){inta[]={1,2,3};in... #include "stdafx.h"
#include "conio.h"

int _tmain(int argc, _TCHAR* argv[])
{
int a[]={1,2,3};
int b[]={4,5,6};
int k;
int *p=a,*q=b;
*p=*(p+1);
p=p+1;
for(k=0;k<3;k++)
{
printf("a[%d]=%d\tb[%d]=%d\n",k,a[k],k,b[k]);
}
_getch();
return 0;
}
小弟就是想知道,*p=*(p+1),这个能改变结果,而地址的改变却不能改变值是为什么。
展开
 我来答
strionws
2012-02-03 · TA获得超过1644个赞
知道小有建树答主
回答量:412
采纳率:0%
帮助的人:377万
展开全部
*p=*(p+1)
相当于p[i]=p[i+1]
前面的*p就相当于取当前地址变量p指向的地址空间内所表示的值
*p=任何东西,就相当于改变了这个地址空间所表示的值,至于地址的值是什么不需要考虑
*(p+1)括号里面的,就相当于地址位置向下挪一位,具体地址的值也是不需要考虑的,
只要能取得p地址的下一个地址即可,括号外面加*就表示取值了。
p->| 地址0 | 值 = 2
| 地址1 | 值 = 4
p+2| 地址2 | 值 = 6
| 地址3 | 值 = 8
| 地址4 | 值 = 0
| 地址5 | 值 = 33
如上所示
地址变量p指向地址0,那么p=地址0,*p=2
p+2=地址2,*(p+2)=6
追问
我是想问,如果p=p+1为什么*p的值为什么没变,就像上面的题目中的p=p+1为什么输出之后值没有变?上面写错了。是q=q+1之后数组b的值没变
追答
你不妨把p的值打出来看看就明白了。

设定p的值用int型数据表示为444555

p=p+1如果就直接这么写意思为,p=444555+1你当然得不到预想中的结果。

你把下面这句话放到程序里看一看输出结果吧
printf("==>P: %d\n==>P+1: %d\n",p,p+1);
手头上没有编译环境,这句话可能有错误,你自己调整一下。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sharebdwk
2012-02-04
知道答主
回答量:8
采纳率:0%
帮助的人:6.6万
展开全部
首先 p q 是指向整形变量的指针 保存的是变量内存地址(保护模式下为逻辑地址,非实际的内存地址) *p=*(p+1), 这行代码 p 保存的是a[0]的地址 而p+1 则是a[1]的地址 这行代码实际是将a[1] 的值赋给a[0] (就是进行了指针所指向的内存处的值的操作) 而 q=q+1 仅仅是让指针 q保存的内存地址变为 b[1]的地址,并没有改变指向的内存处的内容
追问
地址改变,值不变吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
201007031324
2012-02-03 · TA获得超过1239个赞
知道小有建树答主
回答量:505
采纳率:0%
帮助的人:233万
展开全部
#include "stdafx.h"
#include "conio.h"

int _tmain(int argc, _TCHAR* argv[])
{
int a[]={1,2,3};//a[0]=1,a[1]=2,a[2]=3
int b[]={4,5,6};//b[0]=4,b[1]=5,b[2]=6
int k;//定义整型变量k
int *p=a,*q=b;//p=&a[0],q=&b[0]
*p=*(p+1);// 此时,数组发生了变化,a[0]=2,a[1]=2,a[2]=3
p=p+1;//此时,p不再指向a[0]的地址,p=&a[1],
for(k=0;k<3;k++)
{
printf("a[%d]=%d\tb[%d]=%d\n",k,a[k],k,b[k]);
}
/*k=0时,k<3为真,进行第一次循环,输出a[0]=2,b[0]=4*/
/*k=1时,k<3为真,进行第二次循环,输出a[1]=2,b[0]=5*/
/*k=2时,k<3为真,进行第一次循环,输出a[2]=3,b[0]=6*/
/*k=3时,k<3为假,结束循环*/
_getch();
return 0;
}
//*p=*(p+1),能改变值,p=p+1,改变的是地址,实质上也改变了值,把(p+1)的地址里面内容给了p指向的地址里面的内容,然而, p=p+1,是一个赋值表达式,将原先p指向的地址&a[0],改变成
指向&a[1].他相当于2赋值给了2
//希望能够帮助到你
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
淦海瑶s1
2012-02-03 · TA获得超过3646个赞
知道大有可为答主
回答量:3341
采纳率:100%
帮助的人:763万
展开全部
*p=*(p+1);
带*就是内容,不带*就是指针,这个你应该知道
这句话的意思就是把后一个地址中内容赋值给前一个地址指向的地址指向的空间
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
主页hao123
2012-02-03
知道答主
回答量:55
采纳率:0%
帮助的人:11.1万
展开全部
应为指针是间接访问
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式