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的
但是,前提是只进行一级引用
所以还是秉承着指针兼容性的法则,把代码写的更合理吧~~
这篇就写到这里吧,またね!