关于指针,你真的学会了吗?

@到底什么时候用指针? 什么时候用*号?指针的注意事项

首先:什么是指针?

定义: A pointer is a memory address.(一个指针就是一个内存地址)
创建一个variable:

int foo;

这个variable占据一些内存,这个variable在内存中所处的位置叫做这个variable的地址。在主流的处理器里占据4byte内存(int)
现在来定义另一个变量:

int *foo_ptr = &foo;

foo_ptr 式一个指向int的指针(as a pointer to int),我们已将其初始化为指向foo的指针
&foo就是foo的在内存中所处的位置,也即foo的地址
可以把一个变量想象成一个盒子,访问变量时,就是访问盒子里的内容,访问地址时,也就是访问它所指向的盒子里的内容
在这里插入图片描述
指针就是地址!!
将”地址“形象化地称为“指针"
实际上,对变量进行操作,都是通过变量名i 找到存储单元的地址,从而对存储单元进行存取操作的。
程序经过编译以后将变量名转换成变量的地址,对变量的存取都是通过地址进行的。
-----------------------------------形象化例子------------------------------------------
把房间号比作指针,房间比作变量单元。
地址指向该变量单元就如同:一个房间号对应(指向)一个房间。
将地址形象化称为”指针“,意思就是通过它能找到对应的房间(对应的变量单元)

-------------------------------------------------------------------------------------------
访问变量的两种方式:
·直接访问:直接按变量名访问。
·而指针则是一种间接访问的形式。即将变量i的地址存放在另一个变量中,然后通过该变量找到变量i的地址,从而访问 i变量。

区分两个概念:
1.指针变量:它是一个专门用来存放另一个变量的地址的变量(指针变量的值就是地址)
【指针变量中只能保存地址,不能保存如整型等类型。】
2.指针:一个变量的地址称为该变量的“指针”

指针的含义及表达指针的方式
一个变量的指针包含两个方面:
1.存储单元的地址
2.它指向存储单元的数据类型(如int)
表达方式:
譬如
不能一般地说:a是一个指针变量
应该完整的说:a是一个指向整型数据的指针变量

指针的类型
譬如: 指向整型数据的指针类型表示为 int*
读作 指向int的指针 或简称为 int指针

两个重要的符号

  1. & 取地址的运算符。 &a是变量a的地址
  2. *指针运算符(间接访问运算符)。*p代表指针变量p指向的对象

初始化指针变量:有两种方式
针对基本数据类型
方式一:int a=3; int *p; p=&a;(先定义再赋值)
方式二:int a=3; int *p=&a;(定义和赋值一起)
针对数组元素int a[]={1,2,3,4} ; int *pa; pa=&a[0];(也有上面两种方式,这里不赘述)

什么时候用指针?

1.需要改变实参时,只能用指针。因为数据只能由实参传递给形参,不能由形参传递给实参。(“单向传递”)参考概念:形参vs.实参
实参和形参占用不同的储存单元。
实参->形参
2.动态分配内存时,必须用指针。
3.传递数组时,必须用指针。(因为数组的下标法就是表达地址的一种形式,而指针即地址,指针变量就是储存地址的变量)
4.特殊函数返回类型是指针时(比如fopen)

什么时候用*号?

1.声明变量为指针时。
2.想要修改指针指向的内容时。
3.引用指针变量指向的变量时。

int a=3;
int *p;//针对1.
p=&a;
///
int *p=&a;
*p=0;//针对2,使a等于0
printf("%d",*p);//针对3,会输出p对应的对象,即a的值。
int *pa;
pa=&a[0];
//pa,pa+1,pa+2,.... 分别表示a[0],a[1],a[2]的地址 =>等价于&a[i]
//*pa,*(pa+1),*(pa+2),...分别表示a[0],a[1],a[2]的值
//反映了上面"两个重要符号"中所说的:*p 代表指针变量p指向的对象。

关于指针的注意事项

1.指针变量作为参数传递时,传递只能是数值,传递的是指针变量的值,而不是指针变量的地址。
2.没有*p1+*p2(指针的加法),只有*p1-*p2(指针的减法),表示地址间的相对距离。比如一个数组a[2]a[8]相隔6个元素/
3.由于格式化输出限定的不同,会影响输出的结果。
想要输出地址,一定要用%p;

   printf("%p",*p);//输出p的地址
   printf("%p",p);//输出p指向的对象的地址
   printf("%d",*p);//输出p指向的变量的值,假设变量值为int值,用%d

---------------------------------------------------------------------------------------
部分内容参考书籍《C程序设计(第四版)》谭浩强
有错误请指正,互相学习~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值