
一个用指针变量指向数组元素的问题
我写了这样一个程序#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)为什么也会报错
展开
1个回答
展开全部
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]吗!?明显的数组越界!
数组实质上是指向一段连续内存区域起始地址的指针,所以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]吗!?明显的数组越界!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询