指针的初步学习
1.指针变量
计算机将内存分割为字节,字节可以存储八位的信息,而每个字节都有唯一的地址。如下,如果内存中有n个字节,可以把地址看作0到n-1的数
地址 | 内容 |
0 | 01010011 |
1 | 01110101 |
2 | 01110011 |
所以,在计算机中,每个变量都有相对应的字节地址。如果一个变量占有多个字节,把第一个字节的地址称作变量的地址。
由于地址的取值范围不同于整数,所以我们要用特殊的指针变量存储地址。
比如p是一个指针变量,它存储了i的地址。我们就说 p指向 i;
2.指针变量的声明
int *p;
像上述,int是个类型,*p是指针变量;它指向int型的变量;
3.取地址运算符和间接寻址运算符
上述讲了指针的声明,但是没有把指针指向对象;
如 int *p=&i;
就是把i的地址赋值给了指针变量p 即p指向i;
间接取址运算符
一旦指针变量指向了某个对象,就可以用*(间接寻址)访问对象中的内容。
如*p指向i ,i=5;
printf(“%d”,*p)就会输出5。
对于*和&,可以把*当作&的逆运算。对变量使用&运算符产生指向变量的指针(即地址),而对指针使用*运算符就可以返回到原始变量;
j=*&i与j=i 一个意思。
对于p指向i,就是指向了i所在的那个空间,可以想象把i放在一个固定的柜子里。p就是指明柜子所在的位置。
因此,*p与i不仅有相同的值。*p的改变也会改变i的值。
如例题 要求实现一个计算输入的两数的和与差的简单函数。
void sum_diff( float op1, float op2, float *psum, float *pdiff ) { *psum=op1+op2; *pdiff=op1-op2; }
像
*psum 和*pdiff
传入的是变量的地址。可以在函数里面对该变量空间里存放的东西进行操作,而不需要函数再传入值后再返回值。
就好比 知道了柜子所在的位置之后,我们通过这个函数,对柜子里面的东西进行存放和取出,更改。
3指针赋值
c语言允许指针使用赋值运算符进行指针的复制,但是两个指针需要是相同的类型。
int i,j,*p,*q;
语句
p=&i;
q=p;
第一句是吧i的地址复制给了p;
第二句直接把p的内容赋值给了q;导致p和q的效果一样,都指向了i的地址,就是i的变量空间。
而
*p=*q;
不同,这句话的意思是,把q指向的变量值赋值给p指向的变量。
如上文的*可以当作&的逆运算。因此
可以这么理解:
把指向i变量的p指针,视为 p=&i;
q指向j变量,是为q=&j;
而*q就是*q=*&j
就是j变量本身。