c语言指针学习笔记(二)

6.指针和多维数组

就拿数组int array[5][2]举例 

array  是一个占用两个int大小对象的地址
array[0] 是一个占用一个int大小对象的地址
故此,可以理解给array+1和array[0]+1不同之处
毕竟,一个代表着两个int单位,一个则代表着一个 

array是地址的地址,必须解引用两次才能获得原始值  

int (* pz)[2]  //pz指向一个(内含两个int类型值的)数组
int * pax [2]  //pax是一个(内含两个指针元素的)数组,每个元素都指向int的指针
因为[]的优先级较高 
而对于array来说,指针必须指向一个内含两个int类型值的数组,而不是指向一个int类型值 
然后嘞,* pz=array就okk了

不得不说,c语言博大精深,下面特批上人话:
这个二维数组呢,讲究的是双重解引,把这个pz指针设成了一个含两个int类型的数组,就可以保证,在给pz+1或者+2的时候,这个pz都是两个两个地动(即,以主数组为单位地动)
举个栗子:

*(*(pz+2)+1) 

那这次pz指针指向的是神马东东呢??
原来是array数组里第三个主数组里的第二个元素~~

好的,那么这点跨过去之后,再就指针兼容性谈谈
7.指针的兼容性
指针的赋值与数值类型确实要严格,比如,就不能把int类型的赋给double

int n=5;
double x;
int * pl=&n;
double * pd=&x;
x=n;        //隐式类型转换
pd=pl;      //编译不通过

不仅如此,还有以下更复杂的栗子

int * pt;
int (*pa)[3];
int ar1[2][3];
int ar2[3][2];
int **p2       //一个指向指针的指针
 
pt=&ar1[0][0]; //都是指向int的指针
pt=ar1[0];     //都是指向int的指针
pt=ar1;        //无效
pa=ar1;        //都是指向内含3个int类型元素数组的指针
pa=ar2;        //无效
p2=&pt;        //both pointer-to-int *   ps:这一点呢,我还没太搞懂,以后再谈指向指针的指针
*p2=ar2[0];    //都是指向int的指针
p2=ar2;        //无效  ps:p2是指向指针的指针。它指向的指针指向int,而ar2是数组的指针,该数组内含两个int类型的元素,所以无效

虽然指针的指针还没get到点,但是,这里有个代码就是按照这个亚子运行的

#include <stdio.h> 
 int main ()
 {
  int **p2;
  int * pt;
  int zippo[]={2,5,41};
  pt=zippo;
  p2=&pt;
  printf("%d",**p2);
  return 0;
 }

输出的结果是2

中间插一个指针定义的代码哈

#include <stdio.h> 
 int main ()
 {
  int array[]={5,7,1,3,6};
  int * pt=array;
  printf("%d",* pt);
  return 0;
 }

输出结果是5

const
把const指针赋值给非const指针不安全,因为可以用新的指针改变const指针指向的数据
反过来还是ok的
但是,前提是只进行一级引用
所以还是秉承着指针兼容性的法则,把代码写的更合理吧~~

这篇就写到这里吧,またね!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值