在C语言中内存单元的地址称为指针,专门用来存放地址的变量,成为指针变量。
指针一般形式
<存储类型> <存储变量> *<指针变量名>;
auto int * pName;
指针的初始化
<存储类型> <数据类型> *<指针变量名>=<地址名>;
例如:
int a,*pa = &a;
把a的地址作为初值赋给了int型的指针pa
int *pa =&a; == int *pa; *pa = &a;两个是一样的
px *px &px区别
设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列,里面加*为改变指针性质,外面*为取值