让我们通过你的例子:
void showInt(int* numbers) // (1)
{
numbers += 3; // (2)
}
int main()
{
int* a = 10; // (3)
showInt(a); // (4)
return 0;
}
(1)numbers
变量传递给这个函数变量的副本; (2)因为(1)在numbers
上所做的所有更改将仅保留在此函数内;因为(1)所有在numbers
上作出的更改将仅保留在此函数内;传递给这个函数的原始变量的值将保持不变!但请注意以下几点:您不能更改传递给该函数的指针(a
)的值,而是通过该指针的副本(即numbers
),您可以更改它指向的值! 这是主要技巧 - 一旦你在函数内部有地址,你就可以在该地址写入,并且在函数返回后这些更改仍然保留。在地址写入包括指针解引用,但你幸运地没有这样做 - 我说'幸运',因为你传递的地址只是内存中的任意地址(10)。如果您试图在地址10处写信,您的程序可能会崩溃。 (3)你已经声明a
是“指向int的指针”类型,所以它的值应该是某个int
对象的地址。你在这里犯了一个危险的错误,因为你认为10是一个int的有效地址,但你实际上并不知道该地址是什么。
(4)您正在向函数传递变量a
的副本。函数将其值存储在numbers
变量中并增加它。所以numbers
现在包含地址13(不是某个整数变量的值是13的地址!)。 a
但仍然相同,它仍然具有相同的值,10
你可能想是这样的:
void showInt(int* numbers)
{
*numbers += 3; // (1)
}
int main()
{
int a = 10; // (2)
showInt(&a); // (3)
return 0;
}
(1)功能,在保持numbers
地址修改值。指针被取消引用。 (2)我们需要有一个int变量的有效地址,而不是随机选取的地址(如10)。因此我们声明int变量,a
。它的地址是&a
。
(3)的地址a
通过可变numbers
传递给showInt
和功能现在可以写入到该地址(这是现在int对象的一个有效地址 - a
)等修改的a
值。函数返回时,a
的值为13.请注意,a
的地址在此处的任何时间点都不会更改。
您需要该函数的名称。 –
@TommyA是的,对不起,我注意到并编辑了它:P – Danny
无论你怎么想'int * a = 10;'都行,不这样做。 –