在经典的交换函数中,当我们传入两个指针时,指针指向的值将交换。但是在这个简单的功能中
int leng (char *a)
{
int n;
for (n=0; *a!='\0'; a++)
n++;
return n;
}
调用函数后,指针仍然指向数组的第一个元素,而不是最后一个元素。这是为什么?它与交换功能有何不同?
在经典的交换函数中,当我们传入两个指针时,指针指向的值将交换。但是在这个简单的功能中
int leng (char *a)
{
int n;
for (n=0; *a!='\0'; a++)
n++;
return n;
}
调用函数后,指针仍然指向数组的第一个元素,而不是最后一个元素。这是为什么?它与交换功能有何不同?
指针本身就是一个对象。在这种情况下,您通过值而不是通过引用传递指针,因此对指针本身的任何更改都不会反映在函数之外。如果您要更改函数中指针指向的对象,这些更改将在函数外部持续存在。
尝试:
int leng (char** a)
{
int n;
for (n=0; **a!='\0'; (*a)++)
n++;
return n;
}
leng(&pointer);
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.
它实际上与swap
函数相同:swap
函数允许您更改指向的值,但不允许您更改指针本身。同样,leng
可以更改字符串中a
指向的字符,但更改为a
自身(将其更改为指向不同的数组元素)将不会被调用者看到。
如果你想改变它,你可以这样写:
int leng (char **a)
{
int n;
for (n=0; **a!='\0'; *a++)
n++;
return n;
}
并传入一个指向 a
.
您可能需要一个指向指针的指针,而不仅仅是一个常规指针。(指针本身是按值传递的,您正在更改传入的指针副本的值)。