C++,创建指向字符数组的指针

9

在C++中,我定义了一个char数组:

char miniAlphabet[] = {'A','B','C','D','E', '\0'};

我希望能够在不将数组传递到其他函数的情况下修改该数组的值。这时你需要使用指针,对吗?
所以我的问题是,如何正确地制作指向此 char 数组的指针。我是否仅需创建指向第一个元素的指针,并在想要修改值时遍历内存直到找到结尾字符?

刚查了一下,确实比 \0 好多了。谢谢。 - James MV
4个回答

23
char miniAlphabet[] = {'A','B','C','D','E', '\0'};

它们是等价的。

char *p1 = miniAlphabet;

char *p2 = &(miniAlphabet[0]);

请注意,() 对于运算符的优先级是没有作用的,因此

char *p3 = &miniAlphabet[0];
在C/C++中,数组的名称是指向数组第一个元素的指针。然后可以使用指针运算来进行一些神奇的操作...这将指向第二个元素:
char *p4 = &miniAlphabet[0] + 1;

喜欢

char *p5 = &miniAlphabet[1];
或者
char *p6 = miniAlphabet + 1;

2
嗨,我有一个快速的问题。当你执行char *p1 = miniAlphabet时,p1现在存储数组第一个元素的地址。为什么当我们执行cout << p1 << endl时,我们得到整个char数组(在这种情况下是ABCDE),而不是第一个元素的地址? - Danny Brown
2
因为cout的创作者决定这样做。它甚至可以始终为任何char *指针编写“hello world”,但这将是愚蠢的。如果您从事文本编写的职业,最明智的做法是将char 打印为字符串。如果您想要打印指针地址,请使用<< static_cast<void *>(p1)*。 - xanatos
考虑到在C++中,数组的名称是指向数组第一个元素的指针,因此如果说“char miniAlphabet[] = {'A','B','C','D','E','\0'};”,那么在“char p1 = miniAlphabet;”中,“p1”是指向指针的指针吗? - Daniel Zardo
1
@DanielZardo 这是相反的。使用 *p1,您正在取消引用指针(访问指针指向的值),因此您正在获取第一个元素。char p2 = *p1;。指向指针的指针将是 char **p3 = &p1; - xanatos
这对我不起作用,我正在使用C++20编译。当我创建一个char数组并创建一个指针引用时,我只打印整个字符数组。 - user16422658
1
@theMyth 指针指向第一个字符,但它不包括“长度”。char*既是指向单个char的指针,也是指向所谓的C字符串(以零结尾的字符串)的指针。这取决于你如何使用它。 - xanatos

2
数组在内存中的位置与其第一个元素的位置相同。因此,例如,以下两个函数签名是等效的:
function changeArray(char[] myArray);
function changeArray(char* myArray);

你可以这样调用其中任意一个版本:

changeArray(miniAlphabet);

...or

changeArray(&(miniAlphabet[0]));

我曾经认为char*在声明时是一个常量。如果是这样的话,第二个函数不会改变char数组的任何内容,而第一个函数可以吗? - MintyAnt
你不能在函数内更改 char* 的值,但可以更改它指向的值,即数组。因此,这两个声明都允许更改原始数组。 - Diego

1
如果您将一个数组传递给函数,实际上是通过引用传递的,因为数组变量实际上只是指向数组中第一个元素地址的指针。因此,您可以像这样调用函数:

funcName(miniAlphabet);

并像这样“按引用”接收数组:

void funcName(char *miniAlphabet) {
   ...
}

1
简而言之,是的。当您创建数组时,miniAlphabet是指向您定义的大小和类型的数组的指针。这也是指向第一个元素的指针。
以下是您所建议的示例。
void foo(char *array)
{
    array[0] = 'z';
    array[2] = 'z';
}

...

char myArray[] = { 'a', 'b', 'c'};
foo(myArray);
//myArray now equals  {'z', 'b', 'z'}

另外需要注意的是,对myArray进行解引用操作会返回第一个元素的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接