任何人都可以向我解释这段代码吗?我是C的新手

时间:2016-05-20 22:38:04

标签: c string reverse

我正在尝试学习C,所以我去尝试C中的一些coderbyte挑战,其中一个是反转字符串。在由于语法导致多个编译错误后,我尝试查找示例并在http://www.programmingsimplified.com/c-program-reverse-string上遇到此问题

#include<stdio.h>

int string_length(char*);
void reverse(char*);

main() 
{
  char string[100];

  printf("Enter a string\n");
  gets(string);

  reverse(string);

  printf("Reverse of entered string is \"%s\".\n", string);

  return 0;

}

   void reverse(char *string) 
   {
      int length, c;
      char *begin, *end, temp;

      length = string_length(string);
      begin  = string;
      end    = string;

      for (c = 0; c < length - 1; c++)
         end++;

      for (c = 0; c < length/2; c++)
      {        
         temp   = *end;
         *end   = *begin;
         *begin = temp;

          begin++;
          end--;
      }
   }

   int string_length(char *pointer)
   {
      int c = 0;

    while( *(pointer + c) != '\0' )//I DON'T UNDERSTAND THIS PART!!!!!
      c++;

    return c;
}

c甚至不是char,所以为什么要添加它?或者是指针考虑while循环的上下文的某种索引?

5 个答案:

答案 0 :(得分:2)

这里的+运算符并不意味着字符串连接;它意味着指针算术。 pointer是指向char的指针,cint,因此pointer + c会生成指向char的指针c {1}} char在记忆中更进一步。例如,如果您有一个数组{'j', 'k', 'l', 'm'}pointer指向'j',而c为2,则pointer + c将指向{{1} }}。如果你推进这样的指针,那么请遵循它,它的作用与数组索引语法相同:'l'。因此,循环等同于:

pointer[c]

添加指向整数的指针(反之亦然)的效果会根据指针所指向的大小进行缩放,因此您无需考虑不同大小的对象。 while( pointer[c] != '\0' ) c++; ,如果foo + 5是一个指针,将在内存中进一步前进5个对象,无论对象foo指向哪个大小(假设foo指向它的类型声明指出)。

答案 1 :(得分:2)

在这里你可以谈论指针算法。

有一个重要的概念:

  • 向指针添加整数将向前移动指针。您要添加的数字将乘以指针所指向的类型

示例:

int以4个字节编码,因此当我们将指针递增1时,我们必须乘以4以获得常规算法中真正发生的事情。

int a[3] = {1, 3, 6};

printf("%d\n", *(a + 1)); // print 3, look 4 bytes ahead

printf("%d \n", *(a + 2)); //print 6, look 8 bytes ahead

在你的情况下:

char以1个字节编码,所以

*(pointer + c) with c == 3

将评估前面3个字节(3个字符)的内存地址。

所以代码:

while( *(pointer + c) != '\0' )
  c++;

将评估指针在特定内存地址的值。如果该字符等于 null-character ,则我们已到达字符串的末尾。

答案 2 :(得分:0)

请记住,*(pointer + c)相当于pointer[c]c被用作索引。

答案 3 :(得分:0)

person::person() : person(4) {}

/* reverse: Reverses the string pointed to by `string` */ void reverse(char *string) { int length, c; char *begin, *end, temp; /* compute length of string, initialize pointers */ length = string_length(string); begin = string; /* points to the beginning of string */ end = string; /* will later point to the end of string */ /* make end point to the end */ for (c = 0; c < length - 1; c++) end++; /* walk through half of the string */ for (c = 0; c < length/2; c++) { /* swap the begin and end pointers */ temp = *end; *end = *begin; *begin = temp; /* advance pointers */ begin++; end--; } } /* computes length of pointer */ int string_length(char *pointer) { int c = 0; /* while we walk `pointer` and we don't see the null terminator */ while( *(pointer + c) != '\0' )//I DON'T UNDERSTAND THIS PART!!!!! c++; /* advance position, c */ /* return the length */ return c; } 功能可以改写为

string_length

答案 4 :(得分:-2)

据我所知,如果字符串是:abcd 结果将是:dcba 如果输入是:HELLO-WORLD 输出将是:DLROW-OLLEH