2013-08-21 31 views
0

当我运行下面的代码与递归反转句子代码。为什么常量指针指向一个常量字符?

void reverse(char *ptr) 

它的工作原理。但在教科书功能原型是这样的:

void reverse(const char * const ptr) 

这是为什么呢?在第一个我假设我的指针可以指向一个不同的地址,它指向的值可以改变。在教科书原型中,地址和它指向的值都不能改变。但是,我们需要这个吗?乍一看,因为它是递归的,它指向的值和地址需要被改变才能起作用。也许我在这里错过了一些东西。

#include <stdio.h> 
    void reverse(char *ptr); 

    int main(void) 
    { 
     char sentence[80]; 
     puts("Enter a sentence"); 
     fgets(sentence,80,stdin); 
     reverse(sentence); 
     getch(); 
    } 

    //recursive reverse function 
    void reverse(char *ptr) 
    { 

     if (ptr[0]=='\0') 
     { 
      return; 
     } 
     else 
     { 
      reverse(&ptr[1]); 
      putchar(*ptr); 
     } 
    } 
+0

什么课本?任何提供该签名的教科书都是错误的。 –

+0

Deitel C如何编程第六版 – Lyrk

+0

嗯,我错过了所有这个功能是打印字符串反向......副作用。但是我错过了这一点,因为你的问题在这个问题上毫无意义。当功能没有改变什么时,你为什么会认为签名是错误的? “它指向的值和地址需要被改变才能运行” - 不,显然没有任何变化......每个递归调用都有自己的参数和局部变量。 –

回答

2

功能reverse的名称是误导性的,因为它表明数组已反转到位。名称应该是print_reversed或其他,因为它不会更改数组,但会在屏幕上反转显示。然后有没有什么奇怪的const char * const ptr

+0

但是怎么可能呢?我们声明不能调整ptr来显示不同的地址,然后通过给指针提供下一个字符地址来修改它到不同的地址? const意味着它不能被修改以获得不同的地址或者我错了吗? – Lyrk

+1

@ user1939432没有任何内容正在被修改...每个函数调用的'ptr'都是不同的。 –

+0

这是因为每个递归调用都获得ptr的不同副本吗?如果函数不是递归的,这是行不通的? – Lyrk

相关问题