指针的细则

、指针的作用是“指示对象”。

       首先要理解值和址的关系:相当是一个写着编号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]的地址。

---------------------------------------------------------------------------------------------------------------------------------

     指针的后续知识就下次再见啦


       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值