C++ 如何通过函数中的指针操作char*或char a[]?
将一个字符传递给我理解的函数,有点像(并使用指针进行操作-下面的代码交换c1和c2中的值)C++ 如何通过函数中的指针操作char*或char a[]?,c++,string,pointers,C++,String,Pointers,将一个字符传递给我理解的函数,有点像(并使用指针进行操作-下面的代码交换c1和c2中的值) #包括 使用名称空间std; int main(){ 无效互换(字符*,字符*); 字符c1='a',c2='b'; cout指针确实很棘手,要完全掌握它们,在书籍、教程等中大量阅读它们是很重要的 #include <iostream> using namespace std; void swap(const char** , const char** ); int main(){ co
#包括
使用名称空间std;
int main(){
无效互换(字符*,字符*);
字符c1='a',c2='b';
cout指针确实很棘手,要完全掌握它们,在书籍、教程等中大量阅读它们是很重要的
#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;
}
#包括
使用名称空间std;
无效交换(常量字符**,常量字符**);
int main(){
const char*cs1=“你好”;
const char*cs2=“再见”;
cout对于数组,必须复制字节才能交换数组的内容
指针只是保存地址的变量。
当您尝试交换两个指针时,实际上是在复制
一个地址转换成另一个地址。当你写
您隐式声明了cs1
是一个char[6]
,一个由6个字符组成的数组。从示意图上看,它是[H,e,l,l,o,\0]。同样,cs2
也是一个char[8]
。这是不同的类型!如果您可以交换这两个数组的值,那么新值应该是什么?是否cs1
是cs2
的截断版本:[G,o,o,d,d,b]没有零终止?还是应该是[G,o,o,d,\0]?是否应该cs2
是零填充的:[H,e,l,l,o,\0,\0]还是可以保留最后两个字符的原样:[H、e、l、l、o、\0、e、\0]
一个解决方案是声明<代码> CS1<代码>和代码> CS2<代码>作为指针。为了用字符串文字初始化它们,它们应该是指向常量字符的指针,<代码> const char */COD>参见Chris Eelmaa的答案。C++中的< /P> < P>(以及其他直接访问内存的语言)“交换变量”有多种方式
当你写作时:
char cs1[]=“你好”
然后,您的程序将分配包含“Hello”的内存空间,并让cs1指向它,与cs2相同
cs1包含内存中“Hello”的地址。
cs2包含内存中“再见”的地址
现在,在“交换”时,您至少有三种选择。是希望cs1指向内存中的同一地址,但该内存包含“再见”,还是希望cs1指向cs2的内存地址?另一种可能是为cs1和cs2分配全新的内存,并用所需的字符串填充该内存
情景1:
如果您试图在cs1的内存空间中写入cs2的内容,则5个字符后内存将耗尽,并将中断程序,这是非常糟糕的。
cs1指向“Goodb”,记忆在哭泣
情景2:
温度指向cs1
cs1指向“再见”
cs2点到温度
情景3:
为temp1创建新内存
在那个记忆中写下“你好”
为temp2创建新内存
向那段记忆写下“再见”
cs1指向temp2
cs2指向temp1
使用单个字符的示例与场景1类似,即使使用临时字符
a是一个字符*,所以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的地址,您更改了该值。“数组是静态分配的内存区域。”哈?cs1和cs2有不同的大小,所以交换它们无论如何都不起作用。如果您使用std::swap
和std::string
,这会容易得多。多亏了所有,现在我是一个(小步)更接近理解指针(我希望如此)。
char cs1[] = "Hello", cs2[] = "Goodbye";
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* z = a;
*a = 5;