zoukankan      html  css  js  c++  java
  • 0030 C指针应用:逆序数组指针数组

    /*
     
       总结:
      
          对于一个一维数组来说
            
            int a[5];
     
          1)获取 a[i]的地址有几种方法?
     
              (1)&a[i]
     
              (2)a+i
     
              (3) int *p = a;
                  p+i
     
          2) 获取 a[i]的值有几种方法?
     
             (1)a[i]
             
             (2)*(a+i)
             
             (3) int *p = a;
                *(p+i)
     
             (4)*(&a[i])
     
     
     */
    
    
    #include <stdio.h>
    /**
     *  逆序一个数组
     *
     *  @param a   数组名
     *  @param len 数组长度
     */
    void nixuArray(int a[],int len){
    
        //定义数组指针
        int *p = a;
        
        //定义下标
        int i = 0,j = len-1;
     
        int temp;
        while (i<j) {
            //交换a[i]  和 a[j];
            
            temp = *(p+i);
            *(p+i) = *(p+j);
            *(p+j) = temp;
            
            //修改下标
            i++,j--;
            
        }
    
    }
    
    int main(int argc, const char * argv[]) {
        
        int arr[10]={1,2,3,4,5,6,7,8,9,10};
        //调用函数逆序数组
        nixuArray(arr, 10);
        //遍历数组
        for (int i=0; i<10; i++) {
            printf("%d	",arr[i]);
        }
        
        return 0;
    }
    
    /*
     
       指针数组:
     
           存放指针的数组,就是指针数组
     
       指针数组的定义:
     
           数据类型  * 数组名[数组长度];
     
     
           int *pa[3];
     
           //定义了一个指针数组,数组名是pa,可以用来存放3个指针(必须是int类型变量的指针)
     
       指针数组的使用:
     
           int a=3,b=4,c=5;
           int *pa[3]={&a,&b,&c};
     
           pa[0]  a的地址
           
           pa
     
     
     */
    
    
    #include <stdio.h>
    
    int main(int argc, const char * argv[]) {
        
        int a=3,b=4,c=5;
        int *pa[3]={&a,&b,&c};
        //打印的是指针数组的第一个元素得值
        printf("  &a    = %p
    ",&a);
        printf("  pa[0] = %p
    ",pa[0]);
        
        //打印指针数组的首地址
        printf("  pa    = %p
    ",pa);
        printf("  &pa[0]= %p
    ",&pa[0]);
        
        //访问a的值 a = 3
        printf("  *(&a)    = %d
    ",*(&a));
        printf("  *(pa[0]) = %d
    ",*(pa[0]));
        
        //使用数组名来访问 a的值
        //*pa  == pa[0] (a的地址)
        //**pa
        printf("%d
    ",**pa);
        
        int a1[2][2]={1,2,3,4};
        //定义了一个指针数组 ,赋值为a1[0] 是第一行的地址
        int *pa1[2]={a1[0],a1[1]};
        printf("**pa1 = %d
    ",**pa1);
        //pa1+1   &pa1[1]
        //*(pa1+1)  pa1[1]
        printf("**(pa1+1) = %d
    ",**(pa1+1));
        
        return 0;
    }
    
    /*
     
        两个指针变量之间的运算
     
        1)两个指针之间的减法运算
     
           (1)0x0006  - 0x0003   =  3  (意义不大)
     
           (2)常见的用法:两个指针都指向同一个数组
     
                i.判断两个指针变量指向的元素是否连续
                ii.判断两个指针变量之间相隔几个元素
     
                int a[5]={1,2,3,4,5};
                int *p = a; //p指向了数组的第一个元素
                int *p1 = &a[3]; //p指向了数组的第四个元素
     
      
                注意:两个指针变量之间没有加法运算
     
     
        2)两个指针之间的关系运算
     
     
     */
    
    
    #include <stdio.h>
    
    int main(int argc, const char * argv[]) {
        
        
        int a[5]={1,3,5,7,9};
        int *p = a; //p指向了数组的第一个元素
        int *p1 = &a[1]; //p指向了数组的第四个元素
        
        //地址差值 (p1-p)*sizeof(int)
        printf("p1 - p = %ld
    ",p1 - p);
        printf("p  - p1 = %ld
    ",p - p1);
        
        //如果两个指针变量指向同一个元素 那么他们相减的结果是 0
        //判断两个指针变量指向的元素是否相邻(连续),他们相减的结果是 1的绝对值
        
        //2、两个指针变量之间的关系运算
        // p1 > p
        //1    表示p1在高位
        //0    p在高位或者他们指向了同一个位置
        printf("p1 > p = %d
    ",p1 > p);
        
        
        return 0;
    }
    
    //
    //  main.c
    //  07-数组名访问二维数组
    //
    //  Created by apple on 15/1/8.
    //  Copyright (c) 2015年 itcast. All rights reserved.
    //
    
    #include <stdio.h>
    
    int main(int argc, const char * argv[]) {
        
        int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
        
        //列指针
        //a[0] == &[0][0]  a[0]+1==&a[0][1]   a[0]+2==&a[0][2]
        printf("&a[0][1] = %p
    ",&a[0][1]);
        printf("a[0]+1   = %p
    ",a[0]+1);
        printf("*(a[0]+1)   = %d
    ",*(a[0]+1));  //3
        
        
        printf("&a[0][2] = %p
    ",&a[0][2]);
        printf("a[0]+2   = %p
    ",a[0]+2);
        
        //行指针  a[0]  a[1]  a[2]
        //a+1    //第二行的首地址
        //a+2    //第三行的首地址
         printf("a[1]   = %p
    ",a[1]);
         printf("a+1   = %p
    ",a+1);
        
         printf("a[2]   = %p
    ",a[2]);
         printf("a+2   = %p
    ",a+2);
        
         // a+1 第二行第一个元素的地址
         //*(a+1)  == &a[1][0]
        
        printf("*(a+1) = %p
    ",*(a+1));
        printf("&a[1][0] = %p
    ",&a[1][0]);
        
        
        //a[i]+j     获取的 &a[i][j]
        //*(a[i]+j)  获取 a[i][j]
        //a[i]      *(a+i)
        //*(*(a+i)+j); ----->  a[i][j]
        for (int i=0; i<3; i++) {
            for (int j=0; j<4; j++) {
                //a[i]    *(a+i)
                //printf("%d	",*(a[i]+j));
                printf("%d	",*(*(a+i)+j));
            }
            
            printf("
    ");
        }
        
        return 0;
    }
    
  • 相关阅读:
    CSV格式的文件与EXCEL文件的区别
    Arcgis 离线部署api 4.x的两种本地部署方法!
    IDEA版部署离线ArcGIS api for JavaScript
    java web中统一结果返回封装类JsonResult
    网络最大流dinic
    Luogu P3834 可持久化线段树2(主席树)
    LuoguP2824[HEOI2016/TJOI2016]排序
    2021.03.24模拟赛DP
    Luogu P3166数三角形
    乘法逆元
  • 原文地址:https://www.cnblogs.com/aiti/p/4647537.html
Copyright © 2011-2022 走看看