在C中通过引用打电话

时间:2013-03-10 22:32:02

标签: c

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

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

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

4 个答案:

答案 0 :(得分:6)

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

尝试:

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

leng(&pointer);

答案 1 :(得分:2)

您正在按值传递指针。在函数调用期间,指针值被复制到堆栈中。您正在递增该堆栈变量,然后在函数返回时消失。

答案 2 :(得分:1)

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

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

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

并将指针传递给 a

答案 3 :(得分:1)

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