啥是指针?
首先我们来定义一个i为指针变量,众所周知指针变量存的是某个地址,比如假设王府井大街08号住的是小熊猫,那么:
i = 小熊猫家地址 = 08号;
那么*i = 小熊猫;
指针变量定义就是:基类型 *指针变量名,例如:int *i 、float *j
这就是一个指针!
1、和一般变量定义类似,定义指针变量时一定要记得定义它的基类型。int *i,其中i是变量名,i变量的数据类型是“int *”型,即存放int变量地址的类型。
2、因为不同类型的数据在内存中所占的字节数是不同的,比如int型数据占4字节,char型数据占1字节。而每个字节都有一个地址,比如一个int型数据占4字节,就有4个地址。那么指针变量所指向的是这4个地址中的哪个地址呢?指向的是第一个地址,即指针变量里面保存的是它所指向的变量的第一个字节的地址,即首地址。因为通过所指向变量的首地址和该变量的类型就能知道该变量的所有信息。
3、虽然指针变量存放的是地址,但是它本身作为变量也是有一个地址的,所以这里会出现两个地址,但是别担心,我们一般不会用到指针变量的地址,我们只需要区分这两个概念就可以。
4、指针变量可以运算,比如“使指针向后移1个位置”或“使指针加1”,具体移动多少个字节,就和指针的基类型有关,比如int类型就移动4个字节,“加1”就意味着给地址加4;
5、指针变量当然可以相减,两个临近的指针变量相减得到的是相差的元素个数,不是地址个数:
比如两个“int *”型的指针变量相减,第一个指针变量里面存放的地址是1245036,第二个指针变量里面存放的地址是1245032,那么这两个地址相减的结果是几?是1,而不是4。因为int型变量占4字节,所以一个int元素就占4字节,两个地址之间相差4个地址,正好是一个int元素,所以结果就是1。
6、认识一下取地址符:
int i,*a;
a = &i;
这个时候就是把i的地址赋给a了,&就是取地址符。
7、一般而言,*i表示的都是地址指向的数据,不能用 *i = &a 来给指针赋值,但是有一种情况例外,就是在定义指针变量的时候:int *i = &a,这个时候就可以把a的地址赋给i,其它情况下 *i 都不读入地址。
8、可以直接将一个指针变量赋给另一个指针变量,只要将指针变量名赋给另一个指针变量名即可:比如 j = k。前提是它俩一类型,且都经过初始化。
新手使用指针常见错误:
1、引用了未初始化的野指针,未初始化的指针变量就是“野”指针,它指向的是无效的地址。
不能:int *i;scanf(“%d”,i),而要:int *i,j;i = &j;scanf(“%d”,i)。
2、不能往一个存放NULL地址的指针变量里面写入数据,虽然指针变量如果在定义时不知道指向哪里就将其初始化为指向NULL。只是此时要注意的是,在该指针变量指向有效地址之前不要往该地址中写入数据。