指针与数组之间的难舍难分

  • 数组名
    数组名不代表整个数组中的全部数据,只能表示为数组中首元素的地址,就是一个指针常量。因为数组属于顺序表,逻辑上相邻的元素物理上也相邻。
    (实参数组名表示该数组首元素的地址,而形参数组是用来接受实参传递过来的地址的)

用指针引用数组元素

  • 如果指针 p 指向数组 a 的首元素,数组中序号为 i 的元素可以 *(p+i)这样表示,或者 *(a+i)也可

  • 如果指针 p 已经指向了数组中的一个元素,那么 p+1表示同一个数组的下一个元素,但是要理解的是,这里的 +1并不只是单纯的+1,而是一个数组元素所占用的字节数。p+1表示的地址实际上为p+1*d(d表示为一个数组元素所占用的字节数)

  • 指向数组的指针变量可以带下标,eg: p[i] 程序编译时,对下标的处理方法是转化为地址的,对p[i]处理为*(p+i) 但是必须知道指针变量的当前值是什么!比如指针变量p当前指向a[3],则p[2]不是表示a[2],而是a[5]。

  • *(p+i)与 p[i] 无条件等价【注意,输入的时候,p[i]表示的是值,*p[i]:没有这个写法,输入时的正确写法:scanf("%d",&p[i]);用的是“&”,而不是写*p[i]】 通常表示一个数组元素时,eg: a[i],[ ]实际上是变址运算符,a[i]按a+i*d找到地址,然后找到值。

  • 如果两个指针变量p1和p2都指向同一个数组,则p2-p1表示两个地址之差除以单个数组元素的长度,比如整型数组,p2表示地址2020,存的是a[5],p2表示地址2012,存的是a[3],则p2-p1即为(2020-2012)/4=2,即表示p1与p2之间相差两个元素;p1+p2无意义

  • 一定要弄清楚指针变量的当前值。
    就比如对于一个数组,指针变量通过循环走到了最后一个元素,如果此时不对指针变量初始化,想要继续用这个指针循环输出数组元素,结果就会出现错误。但是编译可以通过。

  • 关于形参数组和指针,就不要过多纠结,直接就看作地址就可以了
    【不要忽略做形参的指针变量,之前自己还在那迷,总之就是指针也有实参形参的区别,就跟变量一样】

  • 二维数组与指针
    有个二维数组a[3][4],a表示的就是第0行的首地址,a+1 表示第1 行的首地址。
    二维数组,可以看成是很多的一维数组,所以在定义指向一维数组的指针变量时,可以:int (*p)[4]; 4就是二维数组的列数。这句话就是说 p 是个指针变量,它指向有4个元素的一维数组,p的值就是这个一维数组的起始地址。

  • 易混淆的点

 int  *p[n];//定义指针数组p,就是这个数组里的元素全都是指针,指向的还是整型的数据
int  (*p)[n];//p是个指针,它指向的是有n个元素的一维数组
  • 指针的指针
    eg: char **p;//就类似二级间址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值