普通的变量在声明的时会给出数据类型和变量名,比如,int a 表示整型的变量a
要想声明一个指针变量,使它指向另外一个变量,要把一个*(星号)放在变量的前面,比如,int* p,现在是一个指针变量指向一个整型,换句话说p是一个可以存放整型变量的地址的变量.
为了在p中存放a的地址,我们需要使用像下面这样的语句p = &a(取a的地址),如果我们把&放在一个变量的前面,我们就得到了那个变量的地址.实际上,它返回一个指针,指向那个特定的变量.
假设,我们声明一个变量a,它被分配的内存地址是204,然后声明一个指向整型的指针变量p,假设他被分配的内存地址是64我们写出如下语句:p = &a, p现在拥有了a的地址,就是说它指向了变量a,我们现在初始化a,比如a=5,那么现在a里面就是5了,
如果打印p将会是什么结果呢?
输出将会是204,因为p的值是204.
如果我们尝试打印&a(取a的地址)会是什么结果呢?
&a同样表示a的地址,所以这同样会是204,
如果我们尝试打印出&p会是怎么样呢?现在p是一个变量,它同样存在内存 中,所以对它取地址,将会得到那个变量的地址,&p将会打印出64,也就是p的地址.
如果我们把一个*(星号)放在指针变量的前面,那么会得到这个指针所指向的地址的值.如果我们尝试打印*p会是什么结果呢? 它会打印出5,这个概念被称为解引用,因为我们有一个引用,或者说,我们在p里面存放着一个地址,然后我们利用这个解引用操作来取得特定地址的值.事实上,我们可以修改这个特定位置的值,举个例子来说,现在*p赋值成为8(*p=8*).*p表示p指向地址的值.那么现在,p所指向的值就改成了8,那么再打印*p或者打印a会是什么结果呢?输出将会是8.当我说p的值的时候,我指的是p的地址.因此,p是地址,而*p是一个值,这个值就是p里面存着的那个地址所指向的内存的值(内容).