鱼C论坛

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

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

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

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

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

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

  3. int main()
  4. {
  5.                 char str1[MAX];
  6.                 char str2[MAX];
  7.                 char *pa1 = str1;
  8.                 char *pa2 = str2;
  9.                 int j = 0;


  10.                 fgets( str1, MAX, stdin );

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


  13.                
  14.                

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

  20.                 pa1 -= 2;


  21.                 while(j--)
  22.                 {
  23.                                 *pa1++ = *pa2++;
  24.                 }
  25.                 printf("打印 %s\n", str1);
  26.                

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

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


  6.         printf("&arr[0] = %p\n", &arr[0]);
  7.         printf("&arr[1] = %p\n", &arr[1]);
  8.         printf("&arr[2] = %p\n", &arr[2]);

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

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

  11.         *pa++;
  12.         printf("pa = %p\n", pa);
  13.        
  14.         *pa++;
  15.         printf("pa = %p\n", pa);
  16.        
  17.         *pa++;
  18.         printf("pa = %p\n", pa);

  19.         return 0;
  20. }
复制代码

  1. &arr[0] = 0115F8A8
  2. &arr[1] = 0115F8A9
  3. &arr[2] = 0115F8AA
  4. **************************
  5. pa = 0115F8A8
  6. pa = 0115F8A9
  7. pa = 0115F8AA
  8. pa = 0115F8AB
  9. 请按任意键继续. . .
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-6-27 22:16:05 | 显示全部楼层
不明白你想问什么
你的代码存在问题
  1. 123456789
  2. 987654321
  3. 3
  4. 3
  5. 打印 123456789987烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫 烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫k^?8
  6. 请按任意键继续. . .
复制代码

  1. while(*pa1++ != '\0')
  2.         {
  3.                 ;
  4.         }

  5.         pa1 -= 2;
复制代码

这是要干嘛?

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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


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


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

  3. int main()
  4. {
  5.                 char str1[MAX];
  6.                 char str2[MAX];
  7.                 char *pa1 = str1;
  8.                 char *pa2 = str2;
  9.                 int j = 0;


  10.                 fgets( str1, MAX, stdin );

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


  13.                
  14.                


  15.                 while ( *pa1++ != '\0' )
  16.                 {
  17.                                 ;
  18.                 }

  19.                 pa1 -= 2;


  20.                 while(j--)
  21.                 {
  22.                                 *pa1++ = *pa2++;
  23.                 }
  24.                 printf("打印 %s\n", str1);
  25.                 printf("%c\n",*(pa1+2));   //用指针打印
  26.                

  27. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


这是要干嘛?
为什么要把pa2 复制到pa1?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  3. int main()
  4. {
  5.         char str1[MAX];
  6.         char str2[MAX];
  7.         char *pa1 = str1;
  8.         char *pa2 = str2;
  9.         int j = 0;


  10.         fgets(str1, MAX, stdin);

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


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


  19. }
复制代码

  1. 123456789
  2. 987654321
  3. 3
  4. 打印 987456789

  5. 6
  6. 请按任意键继续. . .
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-27 22:44:20 | 显示全部楼层
这代码也没有第二家了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个是哪个作业题,《带你学习带你飞》s1e22课,写一个相当于strcat函数的程序。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个是作业题就是《带你学C带你飞》里面的s1e22课后作业写一个相当于strcat函数的程序。
下面 是作业题
捕获2.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

因为覆盖了呀
  1. while(j--)
  2.         {
  3.                 *pa1++ = *pa2++;
  4.         }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  2. #define MAX 1024

  3. int main(void)
  4. {
  5.         char str1[MAX];
  6.         char str2[MAX];
  7.         char *pa1 = str1;
  8.         char *pa2 = str2;

  9.         fgets(str1, MAX, stdin);
  10.         fgets(str2, MAX, stdin);

  11.         while(*pa1++ != '\0')
  12.                 ;
  13.        
  14.         pa1 -= 2;

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

  17.         *pa1++ = '\0';

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

  19.         return 0;
  20. }
复制代码

  1. 123456789
  2. ;987654321
  3. 打印 123456789;987654321

  4. 请按任意键继续. . .
复制代码

小甲鱼最新课程 -> https://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)的指针所以我的逻辑应该是没有错的啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-27 23:21:08 | 显示全部楼层
pa1--
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  3. int main()
  4. {
  5.         char str1[MAX];
  6.         char str2[MAX];
  7.         char *pa1 = str1;
  8.         char *pa2 = str2;
  9.         int j = 0;


  10.         fgets(str1, MAX, stdin);

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



  13.         printf("**************************\n");
  14.         printf("%p\n", pa1);
  15.         printf("**************************\n");




  16.         while(j--)
  17.         {
  18.                 *pa1++ = *pa2++;
  19.         }
  20.         printf("打印 %s\n", str1);


  21.         printf("**************************\n");
  22.         printf("%p\n", pa1);
  23.         printf("**************************\n");


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


  25. }
复制代码

  1. 123456789
  2. 987654321
  3. 3
  4. **************************
  5. 0073F848
  6. **************************
  7. 打印 987456789

  8. **************************
  9. 0073F84B
  10. **************************
  11. 6
  12. 请按任意键继续. . .
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我明白了,看内存地址他是变了,可是还想加一个附加题那就是他为什么会变,这个还不是很明白,谢谢您解惑麻烦了
小甲鱼最新课程 -> https://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));   //用指针打印


}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  3. int main()
  4. {
  5.         char str1[MAX];
  6.         char *pa1 = str1;


  7.         printf("**************************\n");
  8.         printf("%p\n", pa1);
  9.         printf("**************************\n");


  10.         *pa1++;


  11.         printf("**************************\n");
  12.         printf("%p\n", pa1);
  13.         printf("**************************\n");
  14. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-27 23:41:08 | 显示全部楼层
  1. **************************
  2. 00D5F860
  3. **************************
  4. **************************
  5. 00D5F861
  6. **************************
  7. 请按任意键继续. . .
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-7 17:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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