指针语法和增量

时间:2015-08-06 22:13:40

标签: c++ string pointers

#include <iostream>
#include <cstdlib> 
using namespace std; 

void reverse(char* str){
    char *end = str; 
    char tmp; 
    if(str){
        cout << "hello" << endl;
        while(*end){
            cout << end << endl;
            ++end; 
        }

        --end; 

        while (str < end){
            tmp = *str;
            *str++ = *end; 
            *end-- = tmp;
        }
    }
}

int main(){
    char str[] = "helloyouarefunny"; 
    string input = str; 
    reverse(str); 
    for(int i = 0; i < input.length(); i++) {
        cout << str[i]; 
    }
}
  1. if(str){}是否等同于if(str == NULL){}
  2. while(*end){}意味着什么,它到底在做什么?我想我已经大致了解,只要没有&#34;看到&#34;就会继续执行while循环。一个'\0'。但是我不确定这行代码是什么完全
  3. 鉴于if(str){}if(str == NULL){}的等效语句,您会将哪些内容传递给函数str = NULL?例如,在我的main(){}中,我尝试执行char str[] = NULL,从而尝试传递NULL,以便它不会进入代码if(str == NULL){}。但我得到一个错误,说我无法发表此声明char str[] = NULL。所以我的问题是为什么我会收到此错误以及我可以通过reverse()函数传递什么才能使if(str){}内的代码无法执行?我希望这个问题有道理。
  4. 代码++end正在做指针算法吗?所以每次递增时,地址都会移动到它旁边的地址?
  5. 我有点困惑while(str < end){}。仅str*str之间有什么区别?我理解cout << str << endl;与重载运算符<<有关,因此会打印通过参数传递的整个字符串。但是,为什么,当我cout << *end << endl;时,它只在该内存地址打印字符?所以我的问题是,两者之间的区别是什么?当我*str时,它只是解除引用吗?在这个问题中,我实际上可能会问的不只是那个问题。我希望我不要混淆你们&gt; _&lt;。

3 个答案:

答案 0 :(得分:2)

  

if(str){}是否等同于if(str == NULL){}

不,if(str){}相当于if(str != NULL){}

  

while(*end){}意味着什么,它到底在做什么?

由于end的类型为char*while(*end){}相当于while (*end != '\0')。对输入字符串的所有字符执行循环。当到达字符串的末尾时,循环停止。

  

鉴于if(str){}if(str == NULL){}

的等效陈述

这是不正确的。我没有读过段落的其余部分,因为你开始时声明不正确。

  

代码++end正在做指针算法吗?所以每次递增时,地址都会移动到它旁边的地址?

排序。 end的值递增。它指向它在操作之前指向的下一个对象。

  

我有点困惑while(str < end){}

在之前的while循环中,endstr开始递增,直到它到达字符串的末尾。在此循环中,end递减,直到它到达字符串的开头。当end到达str时,while语句的条件值将计算为false并且循环中断。

<强>更新

关于

  

你会将什么传递给函数str = NULL

您可以直接致电

reverse(NULL); 
  

我尝试char str[] = NULL;

str是一个字符数组。它可以使用几种方式初始化:

 // This is what you have done.
 char str[] = "helloyouarefunny"; 

 // Another, more tedious way:
 char str[] = {'h','e','l','l','o','y','o','u','a','r','e','f','u','n','n','y', '\0'}; 

注意第二种方法中存在明确指定的空字符。

您无法将类型为char的数组的变量初始化为NULL。该语言不允许这样做。您可以将指针初始化为NULL但不是数组。

char* s1 = NULL;   // OK
reverse(s1);       // Call the function

s1 = malloc(10);   // Allocate memory for the pointer.
strcpy(s1, "test") // Put some content in the allocated memory
reverse(s1);       // Call the function, this time with some content.

答案 1 :(得分:1)

这些是非常标准的C编程习语。

  1. 不,实际上if (str) ...相当于if (str != NULL) ...
  2. C字符串以空值终止,这意味着“Hello”在内存中表示为字符数组{'H', 'e', 'l', 'l', 'o', '\0'}。与指针一样,逻辑表达式中的0或NULL值被视为false。因此,只要while (*end) ...未到达空字符,while就会执行end循环的主体。
  3. N / A
  4. 正确 - 这将前进到字符串中的下一个字符,或前进到空终止符。
  5. 这是反向算法。在第一个循环之后,end指向字符串末尾的一个,str指向开头。现在我们将这两个指针相互交叉,交换字符。

答案 2 :(得分:0)

1/2)在C和C ++中,ifwhile中的任何内容都被评估为布尔值。当{em>任何其他值被评估为true时,0被评估为false。鉴于NULL相当于0if(str)if(str != NULL)执行相同的操作。

同样,只要while(*end)指向的值不会评估为end0才会循环播放。

3)如果您将char指针传递给此函数,它可能是空指针(char *str = 0),因此您要检查以确保str不是{{ 1}}。

4)是的,然后指针指向内存中的下一个位置,直到最终在字符串末尾找到null

5)也许你的困惑是基于代码缺少括号的事实,循环应该如下:

null

这样两个指针将继续朝着彼此方向前进,直到穿越路径(此时while (str < end){ tmp = *str; *(str++) = *end; *(end--) = tmp; } 将不再小于str