在C语言中内存单元的地址称为指针,专门用来存放地址的变量,成为指针变量。
? ? ? ? <存储类型> <存储变量> *<指针变量名>;
? ? ? ? auto? ? ? ? int? ? ? ? *????????pName;
? ? ? ? <存储类型> <数据类型> *<指针变量名>=<地址名>;
? ? ? ? 例如:
? ? ? ? ? ? ? ? int a,*pa = &a;
? ? ? ? ? ? ? ? 把a的地址作为初值赋给了int型的指针pa
? ? ? ? ? ? ? ? int *pa =&a; == int *pa; *pa = &a;两个是一样的
? ? ? ? 设px为一个指针,则
? ? ? ? px —— 指针变量,它的内容是地址量
? ? ? ? *px —— 指针指向的对象,它的内容是数据
? ? ? ? &px —— 指针变量占用的存储区域的地址,是个常量
? ? ? ? 两指针相减运算
? ? ? ? ? ? ? ? px - py 运算的结果是两指针指向的地址位置之间相隔数据的个数,因此,两指针相减相减不是两指针持有的地址值相减的结果;
? ? ? ? ? ? ? ? 两指针相减的结果不是地址量,而是一个整数值,表示两指针之间相隔数据的个数。、
????????这个程序中y=(*--p)++? 虽然后面有++ 但是是先赋值后加加的 所以为5
? ? ? ? 先前的值给y =5 ,实际现在a[0] = 6
? ? ? ? 一维数组的数组名代表数组的起始地址
? ? ? ? 数组的指针是指数组在内存中的起始地址,数组元素的地址是指指针元素在内存中的起始地址
????????他们四个可以实现完全相同的功能
????????数组名是常量不可改变,但是如上 加减并没有改变 所以可行
? ? ? ? 但是本质是不同的,指针的变量是地址变量,数组的指针是地址常量
? ? ? ? 在a[2][3]中,a[0] 和 a[1] 表示一个常量,表示为数组名
? ? ? ? 可以把二维数组看作多个一维数组组成?????????a和a+1是一行一行走的,隔着8个字节
????????而a[0],a[0]+1隔着4个字节 也可以写成这样:
? ? ? ? 存储行地址的指针变量成为行指针变量
? ? ? ? <存储类型> <数据类型> (*<指针变量名>) [表达式];
? ? ? ? int a[2][3]; int (*p) [3]
#include <stdio.h>
int main(int argc,char *argv[]){
int a[2][4] ={{1,2,3,5},{6,7,8,0}};
int (*p)[4],i,j;
p=a;
for(i=0;i<2;i++){
for(j=0;j<4;j++){
printf("%d %d %d %d",p[i][j],a[i][j],*(*(a+i)+j),*(*(p+i)+j));
puts(" ");
}
}
}
?
????????四种不同的写法都可以遍历二维数组
????????后面两个为 刚开始加i行,加j为走j列,里面加*为改变指针性质,外面*为取值