2

我有一个关于指针的问题。当我在函数中使用指向 char 数组的指针遍历 char 数组时,原始数组保持不变,但是当我在 main 函数中执行此操作时,我无法打印 char 数组。

我是指针的新手。

void f(char* a)
{
    while (*a!=0) {
    *(a++); // going through array
    }
}
int main()
{
    char* a1 = "test";
    f(a1);
    cout <<a1<<endl; // I can normally print out "test"
    return 0;
}

但,

int main()
{
    char* a1 = "test";
    while (*a1!=0) {
    *(a1++);
    }
    cout <<a1<<endl; // won't print anything
    return 0;
}

所以我的问题是,即使我将指针传递给函数,为什么原始数组没有被修改?

4

8 回答 8

5

由于您要递增指针a1,因此它指向循环末尾的字符 '\0' in main。打印空字符不会打印任何内容(空字符串)。

当您对函数执行此操作时,指针a是本地的,也是函数的本地指针。它在函数内被修改,但在main. 如果您希望两个示例之间的结果相似,则必须更改函数以接受指针的引用参数:

void f(char * &a) { . . . }
于 2013-09-06T18:35:14.513 回答
3

f(a1);

退出a1后不会修改你的f

然而

while (*a1!=0) {
    *(a1++);
    }

cout

a1指向空字符,因此不会打印任何内容

于 2013-09-06T18:34:15.820 回答
3

a1当你调用你的函数时,你并没有改变。您只是更改a1传递给该函数的副本:a

但是当你调用a1++你的主函数时,你正在改变a1,当它完成时,a1将是0'\0'

于 2013-09-06T18:34:46.543 回答
2

a1当函数 main() 仍处于活动状态时,该数组存在。
的地址a1被传递给函数。
这样的地址被保留,a1因为main()仍然处于活动状态。
现在,变量a是一个指针,它的初始值是 的副本a1,在你调用的那一刻f(a1)

考虑到它a是一个变量,其行为类似于 int、char、float 等。因此,如果您修改其“值”(即在本例中为a指向的内存地址),原始地址a1保持不变.

a但是,如果您修改f() 内部的成员:

  a[0] = '!';

那么原始数组变为:a1等于"!est"
原因是您正在更改a(加0)地址中保存的字符的内容,即(在执行的最开始)(加0)f()地址的内容a1

于 2013-09-06T18:42:43.917 回答
2

不同之处在于,在第二种情况下,是在循环存在之后a1指向字符。\0要在 1 的情况下看到相同的结果,请通过引用接收指针。

void f(char* & a); // Valid in C++ only
于 2013-09-06T18:34:58.827 回答
1

在此处阅读有关指针的更多信息

为了能够在第二种情况下打印字符串,请执行以下操作:

#include <iostream>
using std::cout;
using std::endl;

int main()
{
    char* a1 = "test";
    char *ptr = a1; //create another pointer to a1
    while (*ptr != 0) cout << *ptr++;
    cout << endl << a1 << endl;
    //You should get an output of the same string on 2 lines
    return 0;
}
于 2013-09-06T18:56:04.497 回答
1

形式参数ain与实际参数inf在内存中是不同的对象,因此更改 的值不会影响. a1mainaa1

要模仿第二个片段的行为,您必须将指针传递给a1,如下所示:

void f( char **a )
{
  while ( **a != 0 )
    (*a)++;  // increment the thing a points to
}

int main( void )
{
  char *a1 = "test";
  f( &a1 );  // pass a pointer to a1
  cout << a1 << endl;
  return 0;
}

在这段代码中,我们不传递存储在a1to中的值f,而是传递 的地址a1f中,我们不写信给a,我们写信给*a,或者a指向什么。

于 2013-09-06T20:09:58.753 回答
0

您正在使用pass-by-value。(C++ 中的所有内容都是按值传递,除非函数参数是引用类型,即 has &,在这种情况下它将是按引用传递。)

在按值传递中,对参数的赋值(并且++是赋值)对函数之外的事物没有任何影响。

于 2013-09-07T00:21:10.090 回答