2

在经典的交换函数中,当我们传入两个指针时,指针指向的值将交换。但是在这个简单的功能中

int leng (char *a)
{
    int n;
    for (n=0; *a!='\0'; a++)
        n++;
    return n;
}

调用函数后,指针仍然指向数组的第一个元素,而不是最后一个元素。这是为什么?它与交换功能有何不同?

4

4 回答 4

6

指针本身就是一个对象。在这种情况下,您通过值而不是通过引用传递指针,因此对指针本身的任何更改都不会反映在函数之外。如果您要更改函数中指针指向的对象,这些更改将在函数外部持续存在。

尝试:

int leng (char** a)
{
    int n;
    for (n=0; **a!='\0'; (*a)++)
        n++;
    return n;
}

leng(&pointer);
于 2013-03-10T22:33:21.037 回答
2

You are passing in a pointer by value. The pointer value is copied on to the stack during the function call. You are incrementing that stack variable, which then goes away when the function returns.

于 2013-03-10T22:34:52.020 回答
1

它实际上与swap函数相同:swap函数允许您更改指向的值,但不允许您更改指针本身。同样,leng可以更改字符串中a指向的字符,但更改为a自身(将其更改为指向不同的数组元素)将不会被调用者看到。

如果你想改变它,你可以这样写:

int leng (char **a)
{
    int n;
    for (n=0; **a!='\0'; *a++)
        n++;
    return n;
}

并传入一个指向 a.

于 2013-03-10T22:33:35.360 回答
1

您可能需要一个指向指针的指针,而不仅仅是一个常规指针。(指针本身是按值传递的,您正在更改传入的指针副本的值)。

于 2013-03-10T22:33:49.290 回答