字符指针分配不起作用

时间:2018-04-19 07:12:40

标签: c++ xcode

我这里有一段代码。

void MyString::rm_left_space(char *s){
    int size = getSize(s);
    char s2[size];
    char *s1=&s2[0];
    int i=0;
    while(*(s+i)==' '){
        i++;
    }
    for (int k=i,l=0; k<size; k++) {//start from i, discarding spaces
        *(s1+l) = *(s+k);
        l++;
    }
    s=s1;
}

void MyString::rm_right_space(char *s){
    int countSpacesfromLast=0;
    int size = getSize(s);
    int j=size-1;
    while(*(s+j)==' '){
        countSpacesfromLast++;
        j--;
    }

    char *s2=new char[size-countSpacesfromLast];
    for (int t=0; t<size-countSpacesfromLast; t++) {
        *(s2+t)=*(s+t);
    }
    s=s2;
}

void MyString::rm_space(char *s){
    rm_left_space(s);
    rm_right_space(s);
}

如果有s = s1且s = s2,则不会发生分配。如何指针分配不起作用。

在rm_space方法中,函数调用后s没有变化。为什么呢?

2 个答案:

答案 0 :(得分:0)

  

在rm_space方法中,函数调用后s没有变化。为什么呢?

因为s是按值传递的。换句话说 - 它传递的变量s 但是s拥有的值。被调用函数中的变量s和调用函数中的变量s两个不同的变量。因此,对其中一个进行的更改不会改变另一个。

如果要在被调用函数内的调用函数中更改s,则需要使用call-by-reference。

类似的东西:

void MyString::rm_left_space(char*& s){

但是,请注意您的代码存在严重问题,因为您似乎正在尝试将调用函数中的s2分配给调用函数中的s。你永远不应该这样做,因为s2一旦函数返回就会超出范围。

示例:传值和传值之间的差异

这个简单的程序使用按值传递

#include <iostream>

void foo(int x)
{
  x = 42;
  std::cout << "Inside foo: x=" << x << std::endl;
}

int main()
{
  int x = 21;
  std::cout << "Before foo: x=" << x << std::endl;
  foo(x);
  std::cout << "After foo: x=" << x << std::endl;
  return 0;
}

输出

Before foo: x=21
Inside foo: x=42
After foo: x=21    // notice x didn't change

因为xfoo中的main是两个不同的变量。

这个简单的程序使用传递引用

#include <iostream>

void foo(int& x)   // Notice the &
{
  x = 42;
  std::cout << "Inside foo: x=" << x << std::endl;
}

int main()
{
  int x = 21;
  std::cout << "Before foo: x=" << x << std::endl;
  foo(x);
  std::cout << "After foo: x=" << x << std::endl;
  return 0;
}

输出

Before foo: x=21
Inside foo: x=42
After foo: x=42   // notice that x changed

因为xfoo x引用了main中的int

这些示例使用#include <iostream> int x = 21; int y = 5; void foo(int* p) { *p = 42; p = &y; std::cout << "Inside foo: p = " << p << std::endl; std::cout << "Inside foo: *p = " << *p << std::endl; } int main() { int* p = &x; printf("%p\n", (void*)p); std::cout << "Before foo: p = " << p << std::endl; std::cout << "Before foo: *p = " << *p << std::endl; foo(p); std::cout << "After foo : p = " << p << std::endl; std::cout << "After foo : *p = " << *p << std::endl; return 0; } ,但指针完全相同。

示例:使用指针

Before foo:  p = 0x60106c
Before foo: *p = 21
Inside foo:  p = 0x601070
Inside foo: *p = 5
After foo :  p = 0x60106c  // Pointer value did NOT change
After foo : *p = 42        // Pointed to value DID change

输出:

void foo(int* p)

更换

void foo(int*& p)

Before foo:  p = 0x60106c
Before foo: *p = 21
Inside foo:  p = 0x601070
Inside foo: *p = 5
After foo :  p = 0x601070  // Pointer value DID change
After foo : *p = 5         // Consequently, the pointed to value also changed

会给:

{{1}}

答案 1 :(得分:0)

我是StackOverflow的新手,如果有任何错误,请判断我

我不确定我是否误解了您的意思,所以如果有任何误解,请告诉我。

我想你想删除一个字符串中的左边空格,对吗?

e.g。

"  Hello" --> "Hello"

如果是的话,这是我的版本

#include <iostream>
using namespace std;

#define SIZE 7
void rm_left_space(char* s){
    int size = SIZE; //Because I don't know how to getSize, so I use fixed size instead
    char s2[size]; 
    char *s1 = &s2[0];
    int i = 0;
    while(*(s+i) == ' '){
        i++;
    }
    cout << i << endl;
    for (int k=i,l=0; k<size; k++) {//start from i, discarding spaces
        *(s1+l) = *(s+k);
        l++;
    }
    s=s1; // <-- Shallow copy 
}

void rm_left_space_2(char* s){
    int size = SIZE;
    char *s2 = new char[SIZE]; <-- you should use dynamic array instead of static array 
    int space_num = 0;
    while(*(s+space_num) == ' '){
        space_num++;
    }
    for (int i = 0; i < SIZE; i++){
        s2[i] = s[(i + space_num)%size];
    }

    // s = s2; // <--- shallow copy

    for (int i = 0; i < SIZE; i++){     // You should copy whole array 
        s[i] = s2[i];
    }
}


int main(){

    char s[] = "  hello";
    cout << s << endl;

    rm_left_space_2(s);

    cout << s << endl;



    return 0;
}

输出:

  hello
hello

另外,你可以查看帖子, static array vs dynamic array in C++