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),这个能改变结果,而地址的改变却不能改变值是为什么。 展开
#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),这个能改变结果,而地址的改变却不能改变值是为什么。 展开
5个回答
展开全部
*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[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);
手头上没有编译环境,这句话可能有错误,你自己调整一下。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先 p q 是指向整形变量的指针 保存的是变量内存地址(保护模式下为逻辑地址,非实际的内存地址) *p=*(p+1), 这行代码 p 保存的是a[0]的地址 而p+1 则是a[1]的地址 这行代码实际是将a[1] 的值赋给a[0] (就是进行了指针所指向的内存处的值的操作) 而 q=q+1 仅仅是让指针 q保存的内存地址变为 b[1]的地址,并没有改变指向的内存处的内容
追问
地址改变,值不变吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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
//希望能够帮助到你
#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
//希望能够帮助到你
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
*p=*(p+1);
带*就是内容,不带*就是指针,这个你应该知道
这句话的意思就是把后一个地址中内容赋值给前一个地址指向的地址指向的空间
带*就是内容,不带*就是指针,这个你应该知道
这句话的意思就是把后一个地址中内容赋值给前一个地址指向的地址指向的空间
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询