鱼C论坛

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

[已解决]22课课后题

[复制链接]
发表于 2019-4-25 17:33:27 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 YiMingC 于 2019-4-25 17:50 编辑

关于22课动动手,代码如下,有两个问题:

        1、不太理解为什么读到第一个空字符的时候i会被变成空格符的ascll码+1。
        2、甲鱼老师在课程中说避免使用野指针,那我如果指针内的地址需要像这题一样在用户输入后再加入,那是不是只能先随便定义一个字符变量a,把指针的地址绑定到a的地址上再进行使用呢?
        3、关于指针还是不太理解,比如一个指针:*pa,到底是pa存放地址还是*pa存放地址呢?在21课视频里将pa放入printf()函数打印出的是地址,*pa又是值,到底是谁在存放地址啊....
#include <stdio.h>
void main()
{
        int i = 0;
        char ch,a;
        char *str=&a;
        printf("请输入一个字符串:");
        for (;(ch = getchar())!='\n';i++)
        {
                printf("%d",i);
                *(str+i)=ch;
                printf("%c\n",*(str+i));
        }
        printf("您总共输入了%d个字符!\n",i+1);
}
最佳答案
2019-4-25 19:10:40
1.对于局部变量,因为是定义在栈上的,所以地址是连续的且先定义的变量地址更高(地址的值更大)
  对于题中的 i 和 a , 因为 i 是先定义的,所以 i 的地址更高,且 a 是字符型占一个字节,所以 i 的地址就是 a 的地址+1
  如果 i 的地址是 0x00000006, a 的地址就是 0x00000005(你可以试试改变定义的顺序,改完后程序也会正常
  指针 str 初始指向的是 a 的地址,i = 1 的时候,str + i == &a + 1, 即 str + i == &i ,这时候你再用*(str + i) = ch 就等价于
  i = ch, 所以 i 的值就会改变,而且 i 是由你输入的第二个字符的ASCII值所决定的,这就是你的 i 变成33的原因了(i = 32后    自增)

2.可以使用NULL呀,
  char *str = NULL;
  str = &a;
  这样的话str刚开始是不指向任何地址的

欢迎指正
S1E22_ds_0.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-4-25 17:36:42 | 显示全部楼层
本帖最后由 YiMingC 于 2019-4-25 17:41 编辑

把a字符改成字符数组了,代码是符合要求了,但是还是不太理解这三个问题。麻烦大家帮忙看看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-25 19:10:40 | 显示全部楼层    本楼为最佳答案   
1.对于局部变量,因为是定义在栈上的,所以地址是连续的且先定义的变量地址更高(地址的值更大)
  对于题中的 i 和 a , 因为 i 是先定义的,所以 i 的地址更高,且 a 是字符型占一个字节,所以 i 的地址就是 a 的地址+1
  如果 i 的地址是 0x00000006, a 的地址就是 0x00000005(你可以试试改变定义的顺序,改完后程序也会正常
  指针 str 初始指向的是 a 的地址,i = 1 的时候,str + i == &a + 1, 即 str + i == &i ,这时候你再用*(str + i) = ch 就等价于
  i = ch, 所以 i 的值就会改变,而且 i 是由你输入的第二个字符的ASCII值所决定的,这就是你的 i 变成33的原因了(i = 32后    自增)

2.可以使用NULL呀,
  char *str = NULL;
  str = &a;
  这样的话str刚开始是不指向任何地址的

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

使用道具 举报

 楼主| 发表于 2019-4-25 19:22:46 | 显示全部楼层
云星遥 发表于 2019-4-25 19:10
1.对于局部变量,因为是定义在栈上的,所以地址是连续的且先定义的变量地址更高(地址的值更大)
  对于题 ...


噢噢,原来是这样。这两个问题我理解了。感谢~
另外想问一下指针应该如何理解呢?
比如一个指针*pa,地址是由pa存储的还是*pa存储啊,这个可以拆开理解吗?
在21课视频里将pa放入printf()函数打印出的是地址,*pa又是值,现在有点晕...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-25 19:55:05 | 显示全部楼层
pa代表的是指向的地址,*pa是pa指向的地址中所存放的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-25 20:09:59 | 显示全部楼层
云星遥 发表于 2019-4-25 19:55
pa代表的是指向的地址,*pa是pa指向的地址中所存放的值

不是太能理解,
比如:char *pa = &a;
这个定义的意思是给pa赋予&a,然后用*再取值吗?
那可不可以说定义指针的标志就是取值运算符呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-25 20:16:03 | 显示全部楼层
YiMingC 发表于 2019-4-25 20:09
不是太能理解,
比如:char *pa = &a;
这个定义的意思是给pa赋予&a,然后用*再取值吗?

不不不, 你对定义的理解有的问题,定义的时候用的*不是解引用, 没有取值的作用,而是用于表明它的身份是一个指针变量,不然的话系统怎么知道你是要定义一个字符变量还是字符指针呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-25 20:32:40 | 显示全部楼层
云星遥 发表于 2019-4-25 20:16
不不不, 你对定义的理解有的问题,定义的时候用的*不是解引用, 没有取值的作用,而是用于表明它的身份 ...

明白了 多谢啦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-25 20:53:35 | 显示全部楼层

客气了,加油哦,小伙子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-3 17:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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