IOS 学习之二指针

指针

....

数组指针

    /*
     是指向数组元素的指针,本质是一个指针。
     作用:
        使用数组指针间接访问数组的元素
     定义:
        int *p;
     初始化:
        int a[4]={1,2,3,4};
        int *p = a;//定义了一个指针 p 指向了a这个数组的第一个元素。此时 p 就是一个数组指针
        或 
        int *p = &a[0]
     */
    int a[4]={1,2,3,4};
    printf("&a[0] = %p\n",&a[0]);
    printf("&a[1] = %p\n",&a[1]);
    printf("&a[2] = %p\n",&a[2]);

    int *p = a;
    printf("    p = %p\n",p);//p指向了数组 a 的第一个元素
    printf("p + 1 = %p\n",p+1);//p+1 表示偏移的下一个元素
    printf("--------分割 1--------\n");

    //通过数据指针取得内存中对应存储单元的内容
    printf(" *(p+1) = %d\n",*(p+1));
    printf(" *(a+1) = %d\n",*(a+1));
    printf("--------分割 2--------\n");

    //使用数组指针和使用数组名的区别
    printf(" *p++ = %d\n",*p++);
    printf(" *p = %d\n",*p);
    p--;
    printf("--------分割 3--------\n");
    //用数据指针遍历数组;
    for (int i = 0;  i < 4; i++) {
        printf("%d\t",*(p+i));//未改变了 p 的指向
    }
    printf("\n");

    for (int i = 0;  i < 4; i++) {
        printf("%d\t",*p++);//改变了 p 的指向
    }
    printf("\n");

结果

    &a[0] = 0x7fff5fbff740
    &a[1] = 0x7fff5fbff744
    &a[2] = 0x7fff5fbff748
        p = 0x7fff5fbff740
    p + 1 = 0x7fff5fbff744
    --------分割 1--------
     *(p+1) = 2
     *(a+1) = 2
    --------分割 2--------
     *p++ = 1
     *p = 2
    --------分割 3--------
    1   2   3   4   
    1   2   3   4   
    Program ended with exit code: 0 

使用指针逆序数组

    int len=10;

    int a[]={1,2,3,4,5,6,7,8,9,10};
    int *p=a;
    for (int i = 0; i<len/2; i++) {
        int t=*(p+i);
        *(p+i)=  *(p+len-1-i) ;
        *(p+len-1-i)=t;
    }
    for (int i = 0; i<len; i++) {
        printf("%d\t",*(p+i));
    }

指针数组

    是一个有序的指针的集合,本质是一个数组。
    指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。
    指针数组的一般形式:类型说明符 *数据名[数据长度]
    int a;//int 变量
    int *a;//int 类型的指针变量
    int a[5];//int 类型的数组
    int *p=a;//p 为数组指针
    int *a[5];// int类型的指针数组,只能存放 int 类型的数据的地址
   int a = 3, b = 4, c = 5;
    int *pa[3]={&a,&b,&c};
    printf(" &a   = %p\n",&a);
    printf("*pa   = %p\n",*pa);
    printf(" pa   = %p\n",pa);
    printf("pa[0] = %p\n",pa[0]);
    printf("&pa   = %p\n",&pa);
    printf("----------\n");
    //访问a b 的值
    printf("*(&a)     = %d\n",*(&a));
    printf("a         = %d\n",a);
    printf("**pa      = %d\n",**pa);
    printf("**(pa+1)  = %d\n",**(pa+1));
    printf("*pa[0]    = %d\n",*pa[0]);

    int d[2][2] = {1,2,3,4};
    int *pd[2]={d[0],d[1]};//pd/pd[0]为 d[0]的地址,pd+1/pd[1]为 d[1]的地址
    printf("**pd    = %d\n",**pd);
    printf("**(pd+1)= %d\n",**(pd+1));

结果

     &a   = 0x7fff5fbff70c
    *pa   = 0x7fff5fbff70c
     pa   = 0x7fff5fbff740
    pa[0] = 0x7fff5fbff70c
    &pa   = 0x7fff5fbff740
    ----------
    *(&a)     = 3
    a         = 3
    **pa      = 3
    **(pa+1)  = 4
    *pa[0]    = 3
    **pd    = 1
    **(pd+1)= 3

指针变量之间的运算

注:只有指向同一数组的两个指针变量之间才能进行计算,否则无意义。

    int a[5]={1,2,3,4,5};
    int *p =a ;
    int *p1=&a[1];
    int *p2=&a[2];

    /*
      若两个指针变量相减的结果是 1 的绝对值,则是连续的。结果的正负性表明指针变量指向的地址的高低性。
      若两个指针变量相减的结果是  0,则指向同一个地址。
     */
    printf(" p1 > p =%d\n",p1>p);//1 p1 处于高地址,p 位于低地址
    printf(" p2 -p1 =%ld\n",p2-p1);//1 p2 p1 指向的地址是连续的

数据名访问二维数组

    int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
    //列指针
    //此时的 a[0]==&a[0][0] a[0]+1 ==&a[0][1] a[0]+2==&a[0][2]

    printf("&a[0][1] = %p\n",&a[0][1]);
    printf("&a[0] +1 = %p\n",a[0]+1);
    printf("&a[0][2] = %p\n",&a[0][2]);
    printf("&a[0] +2 = %p\n",a[0]+2);
    printf("---------------\n");
    //行指针
    //a+1 第二行的首地址
    //a+2 第三行的首地址
    printf("a[1] = %p\n",a[1]);
    printf("a+1  = %p\n",a+1);

    //a+1 第二行第一个无素的地址
    //*(a+1) == &a[1][0]

    printf("*(a+1) = %p\n",*(a+1));
    printf("&a[1][0] = %p\n",&a[1][0]);

    printf("---------------\n");

    //*(a[i]+j) 获取 a[i][j]
    //a[i] ==*(a+i)
    //*(*(a+i)+j)---->a[i][j]

    printf("*(a[1]+3) = %d\n",*(a[1]+3));
    printf("*(*(a+1)+3) = %d\n", *(*(a+1)+3));

结果

    &a[0][1] = 0x7fff5fbff724
    &a[0] +1 = 0x7fff5fbff724
    &a[0][2] = 0x7fff5fbff728
    &a[0] +2 = 0x7fff5fbff728
    ---------------
    a[1] = 0x7fff5fbff730
    a+1  = 0x7fff5fbff730
    *(a+1) = 0x7fff5fbff730
    &a[1][0] = 0x7fff5fbff730
    ---------------
    *(a[1]+3) = 15
    *(*(a+1)+3) = 15

二维数组指针

    /*
     数组指针
        是指向一维数组元素的指针。

     二维数组指针
        是指向二维数据元素的指针。
        是行指针,用来指向二维数组的一行,存放的是首先的地址。
        一般形式:数据类型 (*指针变量名)[二维数组列表长度];
     */

    int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
    int (*p)[4]=a;//定义一个数组指针,指向二维数组a.
    //使用
    for (int i =0; i<3; i++) {
        for (int j = 0; j<4; j++) {
            printf("%d\t",*(*(a+i)+j));
        }
        printf("\n");
    }
    printf("---------\n");

    for (int i =0; i<3; i++) {
        for (int j = 0; j<4; j++) {
            printf("%d\t",*(*(a+i)+j));
        }
        printf("\n");
    }

结果

    1   3   5   7   
    9   11  13  15  
    17  19  21  23  
    ---------
    1   3   5   7   
    9   11  13  15  
    17  19  21  23  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值