经常被问到变量名、地址、值、指针的关系,这里我们记录下,方便其他人阅读理解,有利于理解各种开发语言的变量、地址、值、引用、指针及值传递与引用传递等概念。

C语言一般作为基础语言,我们从C语言开始了解,指针是一个很重要的组成部分,其本质为某一段内存的起始地址。以如下代码进行举例说明:

int a;//定义一个普通变量a
int *p;//定义一个指针变量p
p = &a; //将变量a的地址赋值给指针变量p
  • 指针

    指针的完整名称应该叫指针变量,他也是一种变量只是我们通常叫指针,导致不好理解。

    而指针变量的值,指的就是p本身的值,写作p,在上面的例子中是a的地址,类型为 int* 指针类型。

  • 指针地址

    就是指针变量的地址,所以指针地址的值指的是p的地址值,写作&p,这个地址代表的内存,存储的是p的值,类型为int**型,也就是二级指针。

  • 指针指向的值

    指针变量指向的值,指的是p值代表的地址上存储的值,写作*p,在上面的例子中就是变量a的值,类型为int型。

  • 取址与取值

    大部分语言都会有取址与取值的概念。

    通常用&a来表示取变量a的地址,用*p表示取指针变量对应地址上的值。

    比如c++、golang、java、php等,语法表现是类似的,但可能底层实现方式不大一样比如php的值和c++存储的变量值是不一样的,c++直接存储在内存,而php是通zend的结构体中。