我仍然想知道为什么在C语言中,你不能简单地使用普通变量将一个东西设置为另一个东西。变量本身不是指向数据的指针吗?那么为什么要使指针指向变量中的数据,而不直接使用原始变量呢?这是为了访问变量中特定的位(或字节)数据吗?
我相信这很合理,但我从未完全掌握这个概念,当阅读代码时看到*pointers
总是让我感到困惑。
指针通常有助于编写函数。函数按“按值传递”的方式获取其参数,这意味着它们获取传入内容的副本,如果函数将新值分配给其参数之一,则不会影响调用方。这意味着您无法像这样编写“加倍”函数:
void doubling(int x)
{
x = x * 2;
}
这是有道理的,因为如果您这样调用加倍函数,程序会怎么做呢:这是有道理的,因为否则如果你像这样调用doubling函数:
doubling(5);
指针提供了解决这个问题的工具,因为它们可以让你编写接受变量地址的函数,例如:
void doubling2(int *x)
{
(*x) = (*x) * 2;
}
上述函数的参数为一个整数地址。函数体内的一行代码对该地址进行两次解引用:在等号左边我们将其值存入该地址,在右边我们获取该地址的整数值并乘以2。最终结果是该地址处的值被加倍。
顺便提一句,当我们想要调用这个新函数时,不能传入一个字面值(例如 doubling2(5)
),因为它不会编译通过,我们没有正确地给函数传递地址。一种给它传递地址的方式如下:
int a = 5;
doubling2(&a);
最终结果是,变量a
将包含10。
一个变量本身就是指向数据的指针。
不,它不是。一个变量代表一个对象,即一个左值。左值的概念与指针的概念根本不同。您似乎混淆了两者。
在C语言中,无法重新绑定左值以使其“指向”内存中的另一个位置。左值和它们的内存位置之间的绑定在编译时确定且固定。它并不总是100%特定(例如,局部变量的绝对位置在编译时未知),但足够特定,使其在运行时不可由用户调整。
指针的整个概念是,其值通常在运行时确定,并可以在运行时指向不同的内存位置。
p
是一个指针,那么*p
是一个左值,通过改变p
的值可以使其引用不同的对象。当你说“左值”时,你的意思是命名对象。 - M.M
char ***p
看起来很可怕,但最终它只是保存单个内存地址的变量。 - teppic