【问题标题】:What do we iterate through when using pointer to an array? [duplicate]使用指向数组的指针时,我们迭代了什么? [复制]
【发布时间】:2016-09-02 12:27:06
【问题描述】:

这是一个用于查找特定字母出现的简单函数。

1:  int count_x(char *p, char a)
2:  {
3:      int count = 0;
4:      while(*p != '\0')
5:      {
6:        if (*p == a)
7:            count++;
8:        p++;
9:      }
10:      return count;
11:  }

我们可以通过使用 p[n] 来访问特定元素,或者我们可以取消引用它 *p 并获取该数组的第一个元素作为示例,以及我们通常做的所有事情。
对我来说奇怪的是位于第 8 行。 当我们写p++ 时,我们得到的是我们从一开始就传递了-1 符号的数组。因此,如果它是hello, world,那么它将是ello, world。 我们以某种方式遍历索引,但我真的不明白如何。

我能解释一下所有这些东西是如何工作的吗?

【问题讨论】:

  • 我们得到了从一开始就传递了-1符号的数组。这是什么意思?

标签: c++ c arrays pointers


【解决方案1】:

循环条件*p != '\0'的意思是:*迭代直到p指向的值是'\0'。循环体内的语句

p++;

增加指向传递的字符串的下一个字符的指针。

第一次迭代

+--------+--------+--------+--------+--------+--------+--------+--- ----+--------+--------+--------+--------+
|        |        |        |        |        |        |        |        |        |        |        |        |
|  'h'   |  'e'   |  'l'   |  'l'   |  'o'   |  ','   |  'w'   |  'o'   |  'r'   |  'l'   |  'd'   |  '\0'  |
|        |        |        |        |        |        |        |        |        |        |        |        |
+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
  ^
  |       
  p   

第二次迭代:

+--------+--------+--------+--------+--------+--------+--------+--- ----+--------+--------+--------+--------+
|        |        |        |        |        |        |        |        |        |        |        |        |
|  'h'   |  'e'   |  'l'   |  'l'   |  'o'   |  ','   |  'w'   |  'o'   |  'r'   |  'l'   |  'd'   |  '\0'  |
|        |        |        |        |        |        |        |        |        |        |        |        |
+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
             ^
             | 
             p

等等。当p 到达'\0' 点时,条件*p != '\0' 变为false 并且循环终止。 在每次迭代中,指针p 会改变它指向的位置。字符串保留在其初始存储位置。

【讨论】:

    【解决方案2】:

    TL:DR - 使用指向数组的指针,我们遍历各个元素,就像我们使用数组索引一样。


    当您将数组传递给函数时,它会衰减为指向第一个元素的指针。所以,char *p 指向数组中的第一个元素。

    在这种情况下,该函数需要一个以 null 结尾的 char 数组(或指向以 null 结尾的 char 数组的第一个元素的指针)作为第一个参数。

    一旦增加p,它就会指向下一个元素。这就是为什么,如果你尝试打印传入的字符串,(实际上是"hello, world"),它现在会打印"ello, world"

    此外,通过检查 *p != '\0',您可以确保您不会越过数组(以空值结尾)。

    【讨论】:

    • 好的,请问这个答案有什么问题?
    • 在我看来这是一个正确的答案,我已经投了赞成票。
    • 一旦增加 p,它就指向下一个元素。是的,我明白了。我的意思是弄清楚所有这些到底是如何工作的?当我们说 p++ 时,我们究竟增加了什么?
    • @Caleb 我们增加指针。指针是指向某个对象的地址。现在,一旦 object 是一个数组,它的元素就位于连续的内存位置。因此,当我们增加指针时,它指向下一个元素的地址。
    • @VladfromMoscow 感谢它,先生。但是,我更感兴趣的是得到反对者的评论。有时,这种打了就跑的 DV 很令人沮丧.... sigh ...
    【解决方案3】:

    表达式s[i](其中s 是一个字符数组)按以下方式计算:s 被转换为指向其第一个元素的指针,并应用所谓的指针算法。然后结果指针被取消引用。

    所以你可以通过以下方式成像s[i]

    char *p = s;
    int i = 0;
    p = p + i;
    //...
    if ( *p == a ) count++;
    

    为了得到下一个你可以写的字符

    ++i;
    p = p + i;
    //..
    

    然而这等价于

    ++p;
    p = p + i;
    

    其中i 具有其先前的值。

    所以你可以增加指针的索引。现在只需假设i 始终等于0。

    那你就可以写了

    char *p = s;
    int i = 0;
    p = p + i;
    //...
    if ( *p == a ) count++;
    ++p;
    p = p + 0;
    if ( *p == a ) count++;
    // and so on
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      • 2019-08-24
      • 1970-01-01
      • 2018-08-07
      相关资源
      最近更新 更多