鱼C论坛

 找回密码
 立即注册
查看: 2118|回复: 8

学习指针的时候一个思考题不知道怎么解

[复制链接]
发表于 2013-8-1 22:30:27 | 显示全部楼层 |阅读模式
1鱼币
#include<stdio.h>
void main()
{
int*p,i,a[10];
p=a;
  for(i=0;i<2;i++)
{
  scanf("%d",p++);
}
printf("\n");
for(i=0;i<10;p++,i++)
{
  printf("%d",*p,i);
}
}

最佳答案

查看完整内容

①for语句后不是重新定义数组,而是修正p指针指向数组的位置,因为p++等效于p = p+1,所以p的值不再是以前的a的首地址,而是相当于a[2](a[2]是越界的,数组只有a[0]和a[1]所以如果直接打印会出乱码)的地址了,所以要重新让p指向a[0]的地址 ②printf的format格式楼主可以百度下,我这边简短解释下,每一个%后面接的就是要被替换的变量,“[%d]=%d\n”表示用后面的两个整形变量依次替换前面的%d,即最后输出的字符串就是“[i的值]= ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2013-8-1 22:30:28 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-1 23:12:18 | 显示全部楼层
本帖最后由 Crazy迷恋. 于 2013-8-1 23:14 编辑

printf("%d",*p,i);?这是神马情况
printf("%d",*(p+i));是这样吧?
这个题目就是p指向了数组a  我们知道 数组在内存是一块连续存储的空间地址的++便是地址的改变。
不过楼主没有说出哪里有疑问。所以我也无从答起。只能说说这些了。
for(i=0;i<10;p++,i++)
{
  printf("%d",*p,i);
}
这句很奇怪。为什么这么写呢?只有一个%d啊?p已经向后移动 printf("%d",*(p+i));这样也没啥意义 估计是  楼主漏了一个%d

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2013-8-1 23:24:57 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-2 09:43:03 | 显示全部楼层
#include <stdio.h>
void main()
{
        int *p , i , a[10];

        p = a;

        for(i = 0 ; i < 2 ; i ++)
        {
                scanf("%d", p++);
        }

        puts("\n");

        for(i = 0 , p = a; p <= (a + i),i < 2 ; i++ , p++)
        {
                printf("[%d] = %d\n", i , *p);
        }
}

我从新打了一遍 和上面的楼的差不多 但是在最后的for语句中 我添加了  p = a, p <= (a + i), 用来确定p的地址范围 这样结果就是会出现两个数组元素和他们的变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-2 09:47:14 | 显示全部楼层
1. 2次for循环的次数不相等。
2. 第一次for循环后p值没有恢复到初值。
3. 第二个printf格式错误。

楼主要多调试啊:lol::lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-2 17:20:11 | 显示全部楼层
主要问题就是,第一次循环指针已经在数组结尾了,你要输出数组的值,要重新让指针指到第一个元素。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-2 20:05:49 | 显示全部楼层
SilverMagic 发表于 2013-8-1 23:24
楼主的代码有点小问题,下面是我修改后的代码,有注释

我还是有几个不明白的   为什么跳出for语句后为什么还要重新将定义数组 printf("[%d]=%d\n",i,*p);

这个语句为什么要[%d]=%d这么的写 %d %d为什么输出后会是乱码 在for语句下的pinrtf("\n")这句话是干什么用的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-1-28 14:39:52 | 显示全部楼层
本帖最后由 黑龍 于 2016-1-28 15:31 编辑
943566987 发表于 2013-8-2 20:05
我还是有几个不明白的   为什么跳出for语句后为什么还要重新将定义数组 printf("[%d]=%d\n",i,*p);

这 ...

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
        int *p,i,a[10];
        for(i=0;i<10;i++)/* 初始化数组 */
                a[i]=NULL;
        p=a;
        for(i=0;i<2;i++)
                scanf("%d",p++);
        p=a;
        for(i=0;i<2;i++,p++)
                printf("%d = %d\n",*p,a[i]);
        system("pause");
        return 0;
}
这样就可以了吧 至于跳出for后为什么要重新定义数组
嘿嘿
因为你只将这个指针p指向了a一次,还是在开头的时候
那么你这个p++就等于a[i++];不过呢,你的a的下标递增了,你的指针p没有增加。
但是你的p的指向的地址还保存着
不过你到了第二个for的时候
你的p还往下递增。那么 p就指向了a后面的数字
语文不太好 哈哈
printf("\n");是换行啊
写%d %d也没问题
不过乱码的原因有两个 第一个你跳出了for后 没有重新将p指向到a
第二个就是你的数组只给两个下表赋值了 0 和 1
后面的值都不是一定的 这样你打印出来的话就是乱码啦
还有 指针不是很难理解吧。。。。。
而且 你的main行数写得不太标准哈
PS:你的代码有些浪费空间了
你可以这样改进
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
        int *p,i,a[2];
        p=a;
        for(i=0;i<2;i++)
                scanf("%d",p++);
        p=a;
        for(i=0;i<2;i++,p++)
                printf("%d = %d\n",*p,a[i]);
        system("pause");
        return 0;
}
还有 如果将p打印出来的话打印的是地址哦~
打印*p才是打印出p指向的数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 18:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表