Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何通过函数中的指针操作char*或char a[]?_C++_String_Pointers - Fatal编程技术网

C++ 如何通过函数中的指针操作char*或char a[]?

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

将一个字符传递给我理解的函数,有点像(并使用指针进行操作-下面的代码交换c1和c2中的值)

#包括
使用名称空间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;