一、指针的作用是“指示对象”。
首先要理解值和址的关系:相当是一个写着编号A的盒子里面装了很多编号12345的小球,址是编号A,而值就是里面装的球。指针就是通过获取变量的地址从而找到这个变量。
而我们在定义变量时就相当于开辟了一个箱子,把变量放进了盒子里。对于不同的变量也理应使用对应的盒子(如整型变量使用int类的“盒子”,浮点型变量使用float或者double类的“盒子”),
二、指针变量的使用
取地址运算符&:单目运算符&是用来取操作对象的地址。例如:&i 为取变量 i 的地址。对于常量表达式、寄存器变量不能取地址(因为它们存储在存储器中,没有地址)。将&运算符写在对象名前面就可以得到该对象的地址。
#include<stdio.h>
int main()
{
int i;
i=1;
printf("%d\n",i);
printf("%d",&i);
}
例如上面的代码,在变量i前面加上&后打印出的是6487580,而不是1。这就能很好的理解&的作用。
指针运算符*(间接寻址符):与&为逆运算,作用是通过操作对象的地址,获取存储的内容。例:x = &i,x 为 i 的地址,*x 则为通过 i 的地址,获取 i 的内容。
#include<stdio.h>
int main()
{
int i,*p;
i=1;
p=&i;
printf("%d\n",i);
printf("%d\n",&i);
printf("%d\n",p);
printf("%d",*p);
}
继续利用上面的代码,不过这次增加一个指针变量*p。显然当i的地址被赋值给p后,打印p得到的是变量i的地址6487580,而打印*p得到的是i的值1。这就是指针运算符*的作用。
三、指针与函数
当指针作为函数的参数时,相当于传入变量的地址,在函数中对指针所指的值进行修改,就是对变量本身进行的修改。
看下面两个例子的不同:
#include <stdio.h>
int fun(int *pre)
{
*pre=*pre**pre**pre;
return *pre;
}
int main()
{
int num;
printf("请输入一个数:");
scanf("%d",&num);
fun(&num);
printf("这个数的立方是:%d",num);
return 0;
}
#include <stdio.h>
int fun(int *pre)
{
*pre=*pre**pre**pre;
}
int main()
{
int num;
printf("请输入一个数:");
scanf("%d",&num);
fun(&num);
printf("这个数的立方是:%d",num);
return 0;
}
这两段代码的区别是fun函数是否有返回值,但是在实际运行之后可以发现两段代码的作用是一样的。也就是说我们可以通过将指针变量作为参数传入函数中去,这样在函数中对变量的处理即使不返回值,在主函数中对应的值也是随之改变的。这样做可以解决函数只能返回一个值的限制。
四、scanf函数的理解
这时我们会想到刚开始学习时遇到scanf函数时,使用scanf函数进行读取时,与printf不同的是,必须在变量名前加上一个特殊符号&。scanf函数的使命是为主调函数中定义的对象保存值。倘若它接收到的纯粹是变量的“值”,是无法进行保存的。
因此, scanf函数接收的是指针(具有地址的“值"),由该指针所指对象保存从标准输入(一般为键盘)读到的值。scanf函数的使命是为主调函数中定义的对象保存值。倘若它接收到的纯粹是变量的“值”,是无法进行保存的。因此,scanf函数接收的是指针(具有地址的“值”),由该指针所指对象保存从标准输入(一般为键盘)读到的值。
调用scanf函数的一方相当于发出请求:请将读取到的值放入该地址指向的对象中储存。
五、指针和数组
规则1:数组名原则上会被解释为指向该数组起始元素的指针。
刚学到这时我大为震惊,原来神秘莫测的指针早在之前就已经接触并且使用了。也就是说如果a是数组,那么表达式a的值和a[0]的地址,即&a[0]是一致的。需要注意的是指针p指向的是“起始元素”,而不是“整个数组”。
规则2:指针p指向数组中的元素e时,p+i为指向元素e后第i个元素的指针,p - i 为指向元素e后第i个元素的指针。
如:
#include <stdio.h>
int main()
{
int i;
int a[5]={1,2,3,4,5};
int *p=a; //*p指向a[0]//
for(i=0;i<5;i++)
{
printf("&a[%d]=%p p+%d=%p\n",i,&a[i],i,p+i);
}
return 0;
}
不难看出指向各元素的指针p+i和&a[i]是等价的。当然,&a[i]是指向元素a[i]的指针,其值是a[i]的地址。
---------------------------------------------------------------------------------------------------------------------------------
指针的后续知识就下次再见啦