C++;,创建指向字符数组的指针 在C++中,我有一个字符数组定义为: char miniAlphabet[] = {'A','B','C','D','E', '\0'};

C++;,创建指向字符数组的指针 在C++中,我有一个字符数组定义为: char miniAlphabet[] = {'A','B','C','D','E', '\0'};,c++,pointers,C++,Pointers,我想从其他函数中修改此数组的值,而不将其传递给这些函数。这就是你使用指针的地方,对吗 所以我的问题是什么是指向这个字符数组的指针的正确方法。我是否只需要将指针指向第一个元素,然后当我想要修改值时,我会在内存中一步一步地执行,直到碰到结束字符 char miniAlphabet[] = {'A','B','C','D','E', '\0'}; 这些是等价的 char *p1 = miniAlphabet; char *p2 = &(miniAlphabet[0]); 请注意,()对于

我想从其他函数中修改此数组的值,而不将其传递给这些函数。这就是你使用指针的地方,对吗

所以我的问题是什么是指向这个字符数组的指针的正确方法。我是否只需要将指针指向第一个元素,然后当我想要修改值时,我会在内存中一步一步地执行,直到碰到结束字符

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;


数组在内存中的位置与其第一个元素的位置相同。例如,下面的两个函数签名是等效的:

function changeArray(char[] myArray);
function changeArray(char* myArray);
您可以这样调用任一版本:

changeArray(miniAlphabet);
funcName(miniAlphabet);
void funcName(char *miniAlphabet) {
   ...
}
…或


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

changeArray(miniAlphabet);
funcName(miniAlphabet);
void funcName(char *miniAlphabet) {
   ...
}
并按如下方式“通过引用”接收数组:

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

简言之,是的。创建数组时,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的引用将为您提供第一个元素中的值。

我的印象是char*在声明中是一个常量。在这种情况下,第二个函数不能改变char数组的任何内容,而第一个函数可以吗?你不能在函数中改变char*的值,但是你可以改变它指向的值,在本例中是数组。所以这两个声明都允许对原始数组进行更改。只是查找了一下,是的,比\0好多了。谢谢,我有一个简短的问题。当您使用char*p1=miniAlphabet时,p1现在存储数组第一个元素的地址。为什么,当我们做cout@DannyBrown的时候,因为cout的创造者决定了。它甚至可以一直为任何char*指针写“helloworld”,但这会很愚蠢。如果你是从事文字写作的专业人士,最明智的做法是将字符*打印为字符串。如果要打印指针地址,请执行以下操作: