鱼C论坛

 找回密码
 立即注册
查看: 2443|回复: 26

[已解决]关于用指针打印的问题

[复制链接]
发表于 2017-6-27 21:34:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为什么指针在这里就可以打印如果换到循环后面就打印不了,请教
#include<stdio.h>
#define MAX        1024

int main()
{
                char str1[MAX];
                char str2[MAX];
                char *pa1 = str1;
                char *pa2 = str2;
                int j = 0;


                fgets( str1, MAX, stdin );

                fgets( str2, MAX, stdin );
                scanf("%d", &j);


                
                

                printf("%c\n",*(pa1+2));   //用指针打印
                while ( *pa1++ != '\0' )
                {
                                ;
                }

                pa1 -= 2;


                while(j--)
                {
                                *pa1++ = *pa2++;
                }
                printf("打印 %s\n", str1);
                

}
最佳答案
2017-6-27 23:56:51
奥普瓯江 发表于 2017-6-27 23:50
我想问一下我的理解是否正确,这个程序的意思是,指针相对应的字符串,++之后存储的内存地址重新调取了 ...
#include<stdio.h>

int main(void)
{
        char arr[] = {1, 2, 3};
        char *pa = arr;


        printf("&arr[zxsq-anti-bbcode-0] = %p\n", &arr[zxsq-anti-bbcode-0]);
        printf("&arr[zxsq-anti-bbcode-1] = %p\n", &arr[zxsq-anti-bbcode-1]);
        printf("&arr[zxsq-anti-bbcode-2] = %p\n", &arr[zxsq-anti-bbcode-2]);

        printf("**************************\n");

        printf("pa = %p\n", pa);

        *pa++;
        printf("pa = %p\n", pa);
       
        *pa++;
        printf("pa = %p\n", pa);
       
        *pa++;
        printf("pa = %p\n", pa);

        return 0;
}
&arr[zxsq-anti-bbcode-0] = 0115F8A8
&arr[zxsq-anti-bbcode-1] = 0115F8A9
&arr[zxsq-anti-bbcode-2] = 0115F8AA
**************************
pa = 0115F8A8
pa = 0115F8A9
pa = 0115F8AA
pa = 0115F8AB
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-27 22:16:05 | 显示全部楼层
不明白你想问什么
你的代码存在问题
123456789
987654321
3
3
打印 123456789987烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫 烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫k^?8
请按任意键继续. . .
while(*pa1++ != '\0')
        {
                ;
        }

        pa1 -= 2;
这是要干嘛?

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

使用道具 举报

 楼主| 发表于 2017-6-27 22:37:57 | 显示全部楼层
本帖最后由 奥普瓯江 于 2017-6-27 22:48 编辑
人造人 发表于 2017-6-27 22:16
不明白你想问什么
你的代码存在问题


就是我想用指针打印字符串里的值就是这个语句
printf("%c\n",*(pa1+2));

还有我这个句子用ubuntu这个系统,用gcc编译时没有问题的这是截图
捕获.PNG


改后的句子是这样的但是改成这样就打印不出来了
#include<stdio.h>
#define MAX        1024

int main()
{
                char str1[MAX];
                char str2[MAX];
                char *pa1 = str1;
                char *pa2 = str2;
                int j = 0;


                fgets( str1, MAX, stdin );

                fgets( str2, MAX, stdin );
                scanf("%d", &j);


                
                


                while ( *pa1++ != '\0' )
                {
                                ;
                }

                pa1 -= 2;


                while(j--)
                {
                                *pa1++ = *pa2++;
                }
                printf("打印 %s\n", str1);
                printf("%c\n",*(pa1+2));   //用指针打印
                

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

使用道具 举报

发表于 2017-6-27 22:41:30 | 显示全部楼层
奥普瓯江 发表于 2017-6-27 22:37
就是我想用指针打印字符串里的值就是这个语句
        while(j--)
        {
                *pa1++ = *pa2++;
        }

这是要干嘛?
为什么要把pa2 复制到pa1?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-27 22:43:01 | 显示全部楼层
奥普瓯江 发表于 2017-6-27 22:37
就是我想用指针打印字符串里的值就是这个语句
#include<stdio.h>
#define MAX        1024

int main()
{
        char str1[MAX];
        char str2[MAX];
        char *pa1 = str1;
        char *pa2 = str2;
        int j = 0;


        fgets(str1, MAX, stdin);

        fgets(str2, MAX, stdin);
        scanf("%d", &j);


        while(j--)
        {
                *pa1++ = *pa2++;
        }
        printf("打印 %s\n", str1);
        printf("%c\n", *(pa1 + 2));   //用指针打印


}
123456789
987654321
3
打印 987456789

6
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-27 22:44:20 | 显示全部楼层
这代码也没有第二家了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-27 22:52:33 | 显示全部楼层

这个是哪个作业题,《带你学习带你飞》s1e22课,写一个相当于strcat函数的程序。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-27 22:54:59 | 显示全部楼层

这个是作业题就是《带你学C带你飞》里面的s1e22课后作业写一个相当于strcat函数的程序。
下面 是作业题
捕获2.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-27 23:00:49 | 显示全部楼层

为什么printf("%c\n", *(pa1 + 2));打印的是6能我用指针指向的是3啊,指针初始化不应该是*(pa1 + 0)他指向的不应该是1么,完了我加2他指向的应该是3的啊,没弄明白还请指点谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-27 23:01:22 | 显示全部楼层

为什么printf("%c\n", *(pa1 + 2));打印的是6能我用指针指向的是3啊,指针初始化不应该是*(pa1 + 0)他指向的不应该是1么,完了我加2他指向的应该是3的啊,没弄明白还请指点谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-27 23:03:02 | 显示全部楼层

为什么printf("%c\n", *(pa1 + 2));打印的是6能我用指针指向的是3啊,指针初始化不应该是*(pa1 + 0)他指向的不应该是1么,完了我加2他指向的应该是3的啊,没弄明白还请指点谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-27 23:10:23 | 显示全部楼层
奥普瓯江 发表于 2017-6-27 23:03
为什么printf("%c\n", *(pa1 + 2));打印的是6能我用指针指向的是3啊,指针初始化不应该是*(pa1 + 0)他指 ...

因为覆盖了呀
while(j--)
        {
                *pa1++ = *pa2++;
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-27 23:17:16 | 显示全部楼层
#include<stdio.h>

#define MAX 1024

int main(void)
{
        char str1[MAX];
        char str2[MAX];
        char *pa1 = str1;
        char *pa2 = str2;

        fgets(str1, MAX, stdin);
        fgets(str2, MAX, stdin);

        while(*pa1++ != '\0')
                ;
        
        pa1 -= 2;

        while(*pa2 != '\0')
                *pa1++ = *pa2++;

        *pa1++ = '\0';

        printf("打印 %s\n", str1);

        return 0;
}
123456789
;987654321
打印 123456789;987654321

请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-27 23:20:54 | 显示全部楼层
本帖最后由 奥普瓯江 于 2017-6-27 23:29 编辑


指针是被更改了在他的后面有从新被增加了几个数值,但是指针的指向数值应该是没有变的啊,*pa1是1、*(pa1+1)是2、*(pa1+2)是三以此类推,(先申明我是初学者啊)在这个程序中如果他的指针在没有覆盖前应该是0至8,覆盖了之后应该是加了3位数也就是0至11了,*pa2给了*pa1,我现在要指*(pa1+2)的指针所以我的逻辑应该是没有错的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-27 23:21:08 | 显示全部楼层
pa1--
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-27 23:26:43 | 显示全部楼层
奥普瓯江 发表于 2017-6-27 23:20
指针是被覆盖过但是他的数值应该是没有变的啊,(先申明我是初学者啊)在这个程序中如果他的指针在没有 ...
#include<stdio.h>
#define MAX        1024

int main()
{
        char str1[MAX];
        char str2[MAX];
        char *pa1 = str1;
        char *pa2 = str2;
        int j = 0;


        fgets(str1, MAX, stdin);

        fgets(str2, MAX, stdin);
        scanf("%d", &j);



        printf("**************************\n");
        printf("%p\n", pa1);
        printf("**************************\n");




        while(j--)
        {
                *pa1++ = *pa2++;
        }
        printf("打印 %s\n", str1);


        printf("**************************\n");
        printf("%p\n", pa1);
        printf("**************************\n");


        printf("%c\n", *(pa1 + 2));   //用指针打印


}
123456789
987654321
3
**************************
0073F848
**************************
打印 987456789

**************************
0073F84B
**************************
6
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-27 23:34:36 | 显示全部楼层

我明白了,看内存地址他是变了,可是还想加一个附加题那就是他为什么会变,这个还不是很明白,谢谢您解惑麻烦了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-27 23:39:03 | 显示全部楼层
奥普瓯江 发表于 2017-6-27 23:34
我明白了,看内存地址他是变了,可是还想加一个附加题那就是他为什么会变,这个还不是很明白,谢谢您解惑 ...

#include<stdio.h>
#define MAX        1024

int main()
{
        char str1[MAX];
        char str2[MAX];
        char *pa1 = str1;
        char *pa2 = str2;
        int j = 0;


        fgets(str1, MAX, stdin);

        fgets(str2, MAX, stdin);
        scanf("%d", &j);



        printf("**************************\n");
        printf("%p\n", pa1);
        printf("**************************\n");




        while(j--)
        {
               *pa1++ = *pa2++;
        }
        printf("打印 %s\n", str1);


        printf("**************************\n");
        printf("%p\n", pa1);
        printf("**************************\n");


        printf("%c\n", *(pa1 + 2));   //用指针打印


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

使用道具 举报

发表于 2017-6-27 23:40:54 | 显示全部楼层
#include<stdio.h>
#define MAX        1024

int main()
{
        char str1[MAX];
        char *pa1 = str1;


        printf("**************************\n");
        printf("%p\n", pa1);
        printf("**************************\n");


        *pa1++;


        printf("**************************\n");
        printf("%p\n", pa1);
        printf("**************************\n");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-27 23:41:08 | 显示全部楼层
**************************
00D5F860
**************************
**************************
00D5F861
**************************
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-28 08:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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