这个数组指针程序我有点疑惑了

sxax 2012-11-10 07:30:49
程序如下:
#include <stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int * p;
int i;
p=a;
for(i=0;i<5;i++)
{
*(p+i);

}
printf("%d\n",*(p+i));

}
这样输出的就是不对的


#include <stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int * p;
int i;
p=a;
for(i=0;i<5;i++)
{
*(p+i);//或者这里不写这段代码也对的
printf("%d\n",*(p+i));


}

}
这样就对了,给点提示下,为什么加上输出就行呢?在循环外面输出就错了呢?
有点想不明白
...全文
159 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zodiac1111 2012-11-10
  • 打赏
  • 举报
回复
使用linux,工作在linux下进行,同时学习linux中. 话说在被人的帖子里这样聊天真的没问题吗 = =
引用 12 楼 lbq199204 的回复:
引用 11 楼 zodiac1111 的回复:才不是什么大神呢,才真正的学习c语言没半年. 来这里看看主要是看看大家有什么不会的,同时(更主要的是)检查一下自己有什么不懂的. 起到类似考试模拟题的功效.实际还不要钱,然后自己谷歌一下,说不定以后自己也会碰到类似的问题. 现在主要在linux下使用c/c++.所以这两个版面常逛逛. "For you,for me."……
lbq199204 2012-11-10
  • 打赏
  • 举报
回复
引用 11 楼 zodiac1111 的回复:
才不是什么大神呢,才真正的学习c语言没半年. 来这里看看主要是看看大家有什么不会的,同时(更主要的是)检查一下自己有什么不懂的. 起到类似考试模拟题的功效.实际还不要钱,然后自己谷歌一下,说不定以后自己也会碰到类似的问题. 现在主要在linux下使用c/c++.所以这两个版面常逛逛. "For you,for me." 引用 10 楼 lbq199204 的回复……
你是学linux的?
zodiac1111 2012-11-10
  • 打赏
  • 举报
回复
才不是什么大神呢,才真正的学习c语言没半年. 来这里看看主要是看看大家有什么不会的,同时(更主要的是)检查一下自己有什么不懂的. 起到类似考试模拟题的功效.实际还不要钱,然后自己谷歌一下,说不定以后自己也会碰到类似的问题. 现在主要在linux下使用c/c++.所以这两个版面常逛逛. "For you,for me."
引用 10 楼 lbq199204 的回复:
引用 5 楼 zodiac1111 的回复:先把你代码排一下,强迫症伤不起阿; C/C++ code123456789101112131415#include <stdio.h>int main(){ int a[5] = { 1, 2, 3, 4, 5 }; int *p; int i; p = a; for (i = 0; i < 5;……
lbq199204 2012-11-10
  • 打赏
  • 举报
回复
引用 5 楼 zodiac1111 的回复:
先把你代码排一下,强迫症伤不起阿; C/C++ code123456789101112131415#include <stdio.h>int main(){ int a[5] = { 1, 2, 3, 4, 5 }; int *p; int i; p = a; for (i = 0; i < 5; i++) { *(p + i……
正解!外加,大神,你也在C这里逛的啊?linux上,见到你喔。
newtee 2012-11-10
  • 打赏
  • 举报
回复
引用 7 楼 the_small_base_ 的回复:
引用 5 楼 zodiac1111 的回复:先把你代码排一下,强迫症伤不起阿; C/C++ code 123456789101112131415 #include <stdio.h> int main() { int a[5] = { 1, 2, 3, 4, 5 }; int *p; int i; p = a;……
i到4 4<5 执行{printf("%d\n",*(p+i)); } 然后 i++ i=5 5<5 退出循环
sxax 2012-11-10
  • 打赏
  • 举报
回复
引用 3 楼 zhuankeshumo 的回复:
for(i=0;i<5;i++) { *(p+i); } printf("%d\n",*(p+i)); 这样之后 printf("%d\n",*(p+5)); 也就是a[5] 指针指飞了
i他不是<5吗?0,1,2,3,4刚好的啊?还是有点不理解
sxax 2012-11-10
  • 打赏
  • 举报
回复
引用 5 楼 zodiac1111 的回复:
先把你代码排一下,强迫症伤不起阿; C/C++ code 123456789101112131415 #include <stdio.h> int main() { int a[5] = { 1, 2, 3, 4, 5 }; int *p; int i; p = a; for (i = 0; i < 5; i++) { ……
i到4就停止循环了啊?怎么会越界?
newtee 2012-11-10
  • 打赏
  • 举报
回复
*(p+i);这个不是表达式 因此是报错的 加油!
zodiac1111 2012-11-10
  • 打赏
  • 举报
回复
先把你代码排一下,强迫症伤不起阿;
#include <stdio.h>
int main()
{
	int a[5] = { 1, 2, 3, 4, 5 };
	int *p;
	int i;
	p = a;
	for (i = 0; i < 5; i++) {
		*(p + i); 		//警告:语句不起作用 [-Wunused-value]
	}
	//** 这里 i 等于几? ** 
	printf("%d\n", *(p + i));	//越界,出轨了,木的救了:D
	//警告:在有返回值的函数中,控制流程到达函数尾 [-Wreturn-type]
}
//gcc 1.c -Wall -Wextra -g
看注释
引用 楼主 the_small_base_ 的回复:
程序如下: #include <stdio.h> int main() { int a[5]={1,2,3,4,5}; int * p; int i; p=a; for(i=0;i<5;i++) { *(p+i); } printf("%d\n",*(p+i)); } 这样输出的就是不对的 #include <……
newtee 2012-11-10
  • 打赏
  • 举报
回复
*(p+i)=a[i]=*(&a[0]+i) 这3个是相等的 理解时候往内存上靠比较好理解
newtee 2012-11-10
  • 打赏
  • 举报
回复
for(i=0;i<5;i++) { *(p+i); } printf("%d\n",*(p+i)); 这样之后 printf("%d\n",*(p+5)); 也就是a[5] 指针指飞了
newtee 2012-11-10
  • 打赏
  • 举报
回复
p=&a[0];
指向第一个数
for(i=0;i<5;i++)
{
    *(p+i);
    printf("%d\n",*(p+i));
}
*(p+i)=a[i]=*(&a[0]+i)
慧钦 2012-11-10
  • 打赏
  • 举报
回复
第一段程序,*(p+i) 此时i = 5; *(p+i)已经指向数组a后面一个地址了,超出了,访问越界,其是内容不可知的,也是危险的. 第二段程序,*(p+i) i依次等于0,1,2,3,4即分别指向数组a的每一个元素,正确输出, 单独的一句*(p+i) 只是计算地址,然后取出地址里的内容,作为这语句的返回值,但没有对它进行什么操作,所以没什么影响.

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧