如何通过函数内的指针操作char *或char []?

时间:2014-11-02 00:40:48

标签: c++ string pointers

将char传递给我理解的函数,(用指针操作 - 在代码下面交换c1和c2中的值)。

#include <iostream>
using namespace std;

int main(){
void swap(char* ,char* );
char c1 = 'a', c2 = 'b';

cout << "c1 = " << c1 << ", c2 = " << c2 << endl;
cout << "Now we swap."  << endl;
swap(&c1, &c2);
cout << "c1 = " << c1 << ", c2 = " << c2 << endl;

return 0;
}
void swap(char* a,char* b)
{char temp = *a;
*a = *b;
*b= temp;}

但是一个字符串(其中一个字符串是一个char数组,声明为char * a或char a [])然后像指针一样操作我不明白(下面我想交换cs1和cs2但是代码没有这样做。)

#include <iostream>
using namespace std;

int main(){
void swap(char*[] ,char*[] );
char cs1[] = "Hello", cs2[] = "Goodbye";

cout << "cs1 = " << cs1 << ", cs2 = " << cs2 << endl;
cout << "Now we swap."  << endl;
swap(&cs1, &cs2);
cout << "cs1 = " << cs1 << ", c2 = " << cs2 << endl;

return 0;
}

void swap(char* a[],char* b[])
{char* temp = *a;
*a = *b;
*b= temp;}

我想使用这些基本类型而不是String类中的某些内容。我正在学习,并希望在我进入更高级别的东西之前理解这一点。我的理解有什么问题?

PS我正在使用g ++

4 个答案:

答案 0 :(得分:2)

指针确实很棘手,要完全掌握它们,重要的是你阅读很多关于它们,书籍,教程等等。

#include <iostream>
using namespace std;

void swap(const char** , const char** );

int main(){

const char* cs1 = "Hello";
const char* cs2 = "Bye";

cout << "cs1 = " << cs1 << ", cs2 = " << cs2 << endl;
cout << "Now we swap."  << endl;
swap(&cs1, &cs2);
cout << "cs1 = " << cs1 << ", c2 = " << cs2 << endl;

return 0;
}

void swap(const char** a, const char** b)
{
   const char* temp = *a;
  *a = *b;
  *b= temp;
}

在您的代码中,您无法交换cs1cs2,因为它们不是真正的指针。它们是数组,如何将一个数组与另一个数组交换?

如果您说char hi[] = "TEST"hi与说&hi[0]相同。它是第一个元素的地址。

为了使交换工作,您需要pointer to string

答案 1 :(得分:0)

对于数组,您必须复制字节才能交换数组的内容。

指针只是保存地址的变量 当您尝试交换两个指针时,实际上是在复制
一个地址到另一个地址。

答案 2 :(得分:0)

写作时

char cs1[] = "Hello", cs2[] = "Goodbye";

您隐含声明cs1char[6],一个包含6个字符的数组。示意性地,它是[H,e,l,l,o,\ 0]。同样,cs2char[8]。这些是不同的类型!如果你可以交换这两个数组的值,新值应该是多少? cs1cs2的截断版本:[G,o,o,d,b]没有零终止吗?或者应该是[G,o,o,d,\ 0]? cs2是否应为零填充:[H,e,l,l,o,\ 0,\ 0,\ 0]?或者可以将最后两个字符保留原样:[H,e,l,l,o,\ 0,e,\ 0]?

解决方案是将cs1cs2声明为指针。为了使用字符串文字初始化它们,它们应该是指向常量字符的指针const char*。有关详细信息,请参阅Chris Eelmaa的答案。

答案 3 :(得分:0)

在C ++(以及其他可直接访问内存的语言)中,有多种“交换变量”的方法。

当你写:

char cs1 [] =“你好”;

那么你的程序将分配包含“Hello”的内存空间并让cs1指向它,与cs2相同。

cs1包含内存中“Hello”的地址 cs2包含“Goodbye”内存中的地址。

现在,在“交换”时,您至少有三个选择。你想让cs1指向内存中的同一个地址,但是那个内存包含“Goodbye”,或者你想让cs1指向cs2的内存地址吗?另一种可能性是为cs1和cs2分配全新的内存,并用你想要的字符串填充该内存。

情景1:
如果你试图在cs1的内存空间中写入cs2的内容,那么你将在5个字符之后耗尽内存并且会破坏程序,这是非常糟糕的。
cs1指向“Goodb”并且内存发出嘶声

情景2:
temp指向cs1
cs1指向“再见”
cs2指向temp

场景3: 为temp1创建新内存 将“Hello”写入该记忆中 为temp2创造新的记忆 在那个记忆中写下“再见” cs1指向temp2
cs2指向temp1

使用单个字符的示例与方案1类似,即使您使用临时字符。

a是char *,所以a指向a的地址,b表示相同。

char temp = *a; // This reads the value of the address of a to temp. To have the address pointed to use char* temp = a;
*a = *b; // The value pointed to by a is now the value pointed to by b  
*b= temp;  // The value pointed to by b is now the value of temp

你需要仔细理解为什么写char temp = * a会带来a的值而不是a的地址。

char* z = a;
*a = 5;

z现在也是5,因为z指向a的地址,你改变了这个值。