一个用指针变量指向数组元素的问题
我写了这样一个程序#include<stdio.h>intmain(void){inta[10]={1,2,3,4,5,6,7,8,9,0};inti;int*p;for...
我写了这样一个程序
#include<stdio.h>
int main (void)
{
int a[10]={1,2,3,4,5,6,7,8,9,0};
int i;
int * p;
for(i =0 ; i< 10; i++)
{
scanf("%d",&a[i]);
}
for (p=a ; p<(a+10) ; p++)
{
printf("%d\n",*p);
}
}
目的是用*p输出数组中的数字
但在
for (p=a ; p<(a+10) ; p++)
{
printf("%d\n",*p);
}
这个地方我有两个问题不是很明白
第一问题是
a是数组a[10]的一个起始地址那么将a可以直接复制给p 那么*p=a 可为什么写成
(*p+10)会报错
第二个问题是
p=a 但如果写成(p+10)为什么也会报错 展开
#include<stdio.h>
int main (void)
{
int a[10]={1,2,3,4,5,6,7,8,9,0};
int i;
int * p;
for(i =0 ; i< 10; i++)
{
scanf("%d",&a[i]);
}
for (p=a ; p<(a+10) ; p++)
{
printf("%d\n",*p);
}
}
目的是用*p输出数组中的数字
但在
for (p=a ; p<(a+10) ; p++)
{
printf("%d\n",*p);
}
这个地方我有两个问题不是很明白
第一问题是
a是数组a[10]的一个起始地址那么将a可以直接复制给p 那么*p=a 可为什么写成
(*p+10)会报错
第二个问题是
p=a 但如果写成(p+10)为什么也会报错 展开
9个回答
展开全部
1. 数组实质上是指向一段连续内存区域起始地址的指针,所以int[10]可以复制给int*,这样只会造成数组退化(编译时长度信息丢失)。
2. *p = a永远不会错,因为你只是将a的值赋给了p所指向的内存区域,这句在编译时永不会报错。
3. (*p + 10)和(*(p + 10))你要区分清楚,一个是将p指向的值和10相加的结果,一个是取p+10对应的内存地址的值。
4. *(p + 10)错的原因很简单,你将p看成数组,你p是int[10],你能使用p[10]吗!?明显的数组越界!
2. *p = a永远不会错,因为你只是将a的值赋给了p所指向的内存区域,这句在编译时永不会报错。
3. (*p + 10)和(*(p + 10))你要区分清楚,一个是将p指向的值和10相加的结果,一个是取p+10对应的内存地址的值。
4. *(p + 10)错的原因很简单,你将p看成数组,你p是int[10],你能使用p[10]吗!?明显的数组越界!
追问
前辈 你第4个种的*(p + 10)错的原因很简单 是指的那个*(p + 10)
好像
for (p=a ; p<(a+10) ; p++)
只有这样的写法是不会报错的 其他的都会啊
追答
其它是什么情况?请列举。
展开全部
你没有弄明白指针赋值的意义。若有int a[10],*p,那么指针赋值是p=a,而不是*p=a。*p=a是把指针a赋给了指针p指向的内容,是非法的。而且p=a也不是把a的地址复制给p,而是使p指针和a指针一样都指向a[0],即让p也指向a指向的内容。而p和a都还在两个地方放着,其地址根本不同。你代码中for (p=a ; p<(a+10) ; p++)的写法是正确合法的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int* p;这一句表示p为一个int型的指针。所以简单理解在赋值的过程中应该是p=a,如果p=a,则a[10]应该表示为*(p+10).
在for之前p并没有合法的初值,所以要用p=a给p赋初值。如果你的意思是把p=a直接替换成(p+10),那这不是合法的表达式,不能放在for的括号里,语法上就是不正确的。
在for之前p并没有合法的初值,所以要用p=a给p赋初值。如果你的意思是把p=a直接替换成(p+10),那这不是合法的表达式,不能放在for的括号里,语法上就是不正确的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
*p=a? *p不是指针变量,而是个int变量,你把一个指针变量赋值给int变量类型对不上就错误了,只有p=a才是合法的。。。。
至于第二个,不知道你什么意思,如果你是写语句p<p+10,这个永远是真,这是个死循环,指针会指到程序非配的内存外面的,但我觉得编译不会报错,只是调试时会出错。。。。
至于第二个,不知道你什么意思,如果你是写语句p<p+10,这个永远是真,这是个死循环,指针会指到程序非配的内存外面的,但我觉得编译不会报错,只是调试时会出错。。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
两个指针变量指向同一个数组的元素,则该变量的值相等。
如:
int
*p1;int
*p2;
p1=&a[i];
p2=&a[i];
则
p1-p2=0
如果对p1赋值为1;对p2赋值为4;即p1=1;p2=4;
则p2-p1=4-1=3
如:
int
*p1;int
*p2;
p1=&a[i];
p2=&a[i];
则
p1-p2=0
如果对p1赋值为1;对p2赋值为4;即p1=1;p2=4;
则p2-p1=4-1=3
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询