将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 ++
答案 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;
}
在您的代码中,您无法交换cs1
和cs2
,因为它们不是真正的指针。它们是数组,如何将一个数组与另一个数组交换?
如果您说char hi[] = "TEST"
,hi
与说&hi[0]
相同。它是第一个元素的地址。
为了使交换工作,您需要pointer to string
。
答案 1 :(得分:0)
对于数组,您必须复制字节才能交换数组的内容。
指针只是保存地址的变量
当您尝试交换两个指针时,实际上是在复制
一个地址到另一个地址。
答案 2 :(得分:0)
写作时
char cs1[] = "Hello", cs2[] = "Goodbye";
您隐含声明cs1
是char[6]
,一个包含6个字符的数组。示意性地,它是[H,e,l,l,o,\ 0]。同样,cs2
是char[8]
。这些是不同的类型!如果你可以交换这两个数组的值,新值应该是多少? cs1
是cs2
的截断版本:[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]?
解决方案是将cs1
和cs2
声明为指针。为了使用字符串文字初始化它们,它们应该是指向常量字符的指针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的地址,你改变了这个值。