在经典交换函数中,当我们传入两个指针时,指针指向的值将交换。但是在这个简单的功能中
int leng (char *a)
{
int n;
for (n=0; *a!='\0'; a++)
n++;
return n;
}
调用函数后,指针仍然指向数组的第一个元素而不是最后一个元素。这是为什么?它与交换功能有什么不同?
答案 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)
你可能想要一个指向指针的指针,而不仅仅是一个常规指针。 (指针本身是按值传递的,你正在改变传入的指针副本的值)。