C语言指针

在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 运算的结果是两指针指向的地址位置之间相隔数据的个数,因此,两指针相减相减不是两指针持有的地址值相减的结果;

                两指针相减的结果不是地址量,而是一个整数值,表示两指针之间相隔数据的个数。、

注意指针的当前值

C语言指针_第1张图片

        这个程序中y=(*--p)++  虽然后面有++ 但是是先赋值后加加的 所以为5

        先前的值给y =5 ,实际现在a[0] = 6

指针与数组

        一维数组的数组名代表数组的起始地址

        数组的指针是指数组在内存中的起始地址,数组元素的地址是指指针元素在内存中的起始地址C语言指针_第2张图片

        他们四个可以实现完全相同的功能

        数组名是常量不可改变,但是如上 加减并没有改变 所以可行

        但是本质是不同的,指针的变量是地址变量,数组的指针是地址常量

指针与二维数组

        在a[2][3]中,a[0] 和 a[1] 表示一个常量,表示为数组名

        可以把二维数组看作多个一维数组组成C语言指针_第3张图片C语言指针_第4张图片         a和a+1是一行一行走的,隔着8个字节

        而a[0],a[0]+1隔着4个字节 也可以写成这样:

C语言指针_第5张图片

行指针(数组指针)

        存储行地址的指针变量成为行指针变量

        <存储类型> <数据类型> (*<指针变量名>) [表达式];

        int a[2][3]; int (*p) [3]

#include 

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(" ");
        }        
    }   
}

 C语言指针_第6张图片

        四种不同的写法都可以遍历二维数组

        后面两个为 刚开始加i行,加j为走j列,里面加*为改变指针性质,外面*为取值

你可能感兴趣的:(c语言,开发语言)