C语言指针

发布时间:2024年01月06日

在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列,里面加*为改变指针性质,外面*为取值

文章来源:https://blog.csdn.net/2301_79682745/article/details/135266347
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。