【问题标题】:Explaining what p=(char*)66 does. [closed]解释 p=(char*)66 的作用。 [关闭]
【发布时间】:2012-07-23 11:02:52
【问题描述】:

我在考试中有一个问题,我得到了以下问题:-

第4行是什么意思(第4行发生了什么?)

1    char i , *p;
2    i=65;
3    p=&i;
4    p=(char*)66;
5    (*p)++;

有人可以帮忙吗?

【问题讨论】:

  • 您对它的作用有何看法?
  • 你现在参加考试吗? :-)
  • 将整数转换为指针?不用了。
  • 这只是一个作业。不过,下一行会很有趣。

标签: c pointers


【解决方案1】:

看看This tutorial,它提供了一些关于指针的好信息。我不想告诉你它的确切作用,因为它不会教任何东西,而是给你一个鹦鹉时尚的答案,你会被这样的下一个问题难住。

您想要寻找的区域是强制转换和指针。

【讨论】:

    【解决方案2】:

    "66" 将被转换为 (char *) 类型

    【讨论】:

      【解决方案3】:

      p=(char*)66; 将内存中的地址 66 转换为一个指针,然后在下一行将其递增。照原样,这段代码可能不起作用,除非您碰巧有权限写入 RAM 中的第 66 个字节。

      【讨论】:

        【解决方案4】:

        由于p 是一个指针(在这种情况下指向 char),它拥有一个地址。第 4 行简单地将地址66 写入p。该行执行后,p 指向地址66。这是否是一个有效的地址是另一个问题。

        【讨论】:

          【解决方案5】:

          我修改了第 4 行以使代码更合理。

          1    char i , *p;
          2    i=65;
          3    p=&i;
          4    *p=(char)66;
          5    (*p)++;
          
          • 在第 1 行,您有一个 char i 和一个指向 char p 的指针。

          • 在第 2 行,i 保存值 65,即 ASCII 中的字母“A”。

          • 在第3行,p指向i的地址。

          • 在第4行,p指向的地址中的值为66,即ASCII中的字母B。 由于p指向i的地址,那么i也有66的值。

          • 在第 5 行中,p 指向的地址中的值从66 增加到67,这使其成为ASCII 中的字母C

          如果您打印i*p,您将得到字母“C”。

          【讨论】:

          • ITYM 第 4 行为 *p = (char) 66;
          【解决方案6】:

          我发现在学习一门编程语言时,学习如何大声说出来有助于理解该语言的含义:

          所以p = (char *)66; 在我看来是“将 66 分配给 p”,正如其他人所提到的,(char *) 是一个演员表。它将 66 转换(更改类型)为 char * 的类型,这被称为指向 char 的指针。或者,字符变量的地址。

          基本上整行都在说“在地址 66,你会找到一个字符”,并将 66 分配给之前指向 i 中保存的字符的指针。

          在这种情况下,星号 (*) 的使用与 *p = (char) 66; 行不同,这意味着“p 处的值是 66,它是一个字符值”。因此,虽然我们第一次看到的行修改了p 中保存的地址,但第二行修改了p 中已经保存的地址的值。

          另外,最后一行 ((*p)++) 的意思是:“取 p 的值,然后给它加 1,不管它是什么。”

          请记住,这些不是这个问题的教科书答案,这是你在回答之前思考问题的方式。此外,如果这确实是您在测试中给出的代码,请务必注意,在现实生活中这样做是一个坏主意。在第 4 行和第 5 行中,您正在修改内存中可能甚至不属于您的应用程序的随机位置,这可能(并且可能会)导致崩溃和其他令人讨厌的事情发生。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-05
            相关资源
            最近更新 更多