如何修改指针所指向的数组

时间:2014-09-08 18:02:50

标签: c++ arrays pointers

我需要将char指针传递给function,然后更改它指向函数内部的值并在函数外部打印值。

我遇到的问题是,当我离开功能并尝试在外面打印时,我会丢失它。我该怎么做才能避免这种情况?

这是一个代码示例:

    char array[] = "Bada boom";
    char *pText = array;
    reverseText(pText);
    cout << (pText);

cout应该打印

moob adaB

当我在函数内打印时,一切都很好(它反转打印)。 我的任务是在函数外部打印出来(如第4行代码所示)

这是一个有错误的代码(在func中打印,在外面没有工作)

#include <iostream>
#include <string>
#include <string.h>

using namespace std;

char reverseText(char *text);

int main(){

    char array[] = "Bada boom"; 
    char *pTekst = array;


    reverseText(pTekst);
    cout << (pTekst);                 //in here it doesn't work

}

char reverseText(char *text){
    char befRev[100]; int lenght=-1;

    /*until *text doesn't meet '\0' */
    for(int i=0;*text!='\0';i++){
        befRev[i]=(*text);
        text++;
        lenght++;
    }
    /*reversing*/
    int j=0;
    for(int i=lenght;i>=0;i--){
        *(text+j)=befRev[i];
        j++;
    }

    for(int i=0;i<=lenght;i++)               //in here it does print the right value
        cout << text[i]; 
};

5 个答案:

答案 0 :(得分:3)

只需将阵列重新安排到位。指针本身不需要改变:

#include <cstring>
#include <algorithm>

void reverseText(char* array)
{
  auto len = std::strlen(array);
  std::reverse(array, array+len);
}

int main()
{
  char array[] = "Bada boom";
  char *pText = array;
  reverseText(pText);
  std::cout << pText << std::endl;
}

输出:

  

moob adaB

如果你真的想提供一个指向调用者不同地址的指针,你可以直接返回它:

char* foo(char* stuff)
{
  char* tmp = ....;
  ...
  // do some stuff
  ...
  return tmp;
}

或者,您可以通过引用传递指针,但意图不如以前的版本清晰:

void foo(char*& stuff)
{
  stuff = something_else;
}

但在这两种情况下,你必须绝对确定新指针所指向的东西在函数之外是有效的。这可能需要一些动态内存分配。对于您的情况,似乎最好和最简单的选择是重新安排阵列。

答案 1 :(得分:1)

要回答您的问题,您的逻辑错误。请注意,在reverseText的第一个循环中,您将增加本地指针文本。在你的第二个循环中,你没有将文本重置为它的原始值,所以在从位置文本+偏移开始复制复制之前。

如果您在调用reverseText返回时查看pText,您会发现它包含: &#34; Bada boom \ 0moob adaB&#34;

你的reverseText应该重命名为palindrome:)

答案 2 :(得分:0)

这非常简单。有些要点需要注意:

  1. 将数组传递给函数时,数组会衰减到指针。
  2. 您传入的是以空字符结尾的字符串。因此,传入的char数组的长度是字符串的长度(包括空格)+1。
  3. 因为您使用的是指针,所以无需指定临时变量来保存所有内容。
  4. 以下是C中的一些易于转换为C ++的代码。制定实际的反向算法留给你作为练习。

    #include<stdio.h>
    
    void reverseText(char* text)
    {
        // Hint: It can be done in one loop!
    
        int i;
    
        for(i = 0; i < 9; i++)
        {
            // Your algorithm to reverse the text. I'm not doing it for you! ;)
            *(text + i) = 'r';
    
        }
    
    }
    
    int main()
    {
        char array[] = "Bada boom";
        reverseText(array);
        printf("The text reversed: %s\n", array);
    
        return 0;
    }
    

答案 3 :(得分:0)

我的最终代码:

#include <iostream>

void reverseText(char* text){   
    int length=-1; char tmp;
    /*Length = sign from 0 to 8 without counting explicit NUL terminator*/
    for(int i=0;*(text+i)!='\0';i++){   
        length++; 
    }
    int j=0; int i=length;
    while(j<i){
        tmp=*(text+j);          //tmp=first
        *(text+j)=*(text+i);    //first=last
        *(text+i)=tmp;          //last=tmp
        j++;
        i--;
    }
}

int main(){
    char array[] = "Bada boom"; 
    char *pText = array;
    reverseText(pText);
    std::cout << pText;
}

在开始本练习之前,我应该阅读更多有关指针的内容。

答案 4 :(得分:-1)

您可以返回指针或将指针作为函数参数传递给指针。

//pointer to pointer
void reverseText(char** textPtr) {

    char* newText = ...; //initialize;
    ...
    *textPtr = newText;  //assign newText
}

//return pointer
char* reverseText(char* text) {

    char* newText = ...; //initialize

    return newText;
}

请记住,如果您在此功能中分配内存,则必须动态执行此操作(使用newmalloc),然后您必须将其释放(使用delete或{{1} } 分别)。像这样的函数中的内存分配可能是一种不好的做法,应该避免使用。