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\t",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\n",&a);
    printf("  pa[0] = %p\n",pa[0]);
    
    //打印指针数组的首地址
    printf("  pa    = %p\n",pa);
    printf("  &pa[0]= %p\n",&pa[0]);
    
    //访问a的值 a = 3
    printf("  *(&a)    = %d\n",*(&a));
    printf("  *(pa[0]) = %d\n",*(pa[0]));
    
    //使用数组名来访问 a的值
    //*pa  == pa[0] (a的地址)
    //**pa
    printf("%d\n",**pa);
    
    int a1[2][2]={1,2,3,4};
    //定义了一个指针数组 ,赋值为a1[0] 是第一行的地址
    int *pa1[2]={a1[0],a1[1]};
    printf("**pa1 = %d\n",**pa1);
    //pa1+1   &pa1[1]
    //*(pa1+1)  pa1[1]
    printf("**(pa1+1) = %d\n",**(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\n",p1 - p);
    printf("p  - p1 = %ld\n",p - p1);
    
    //如果两个指针变量指向同一个元素 那么他们相减的结果是 0
    //判断两个指针变量指向的元素是否相邻(连续),他们相减的结果是 1的绝对值
    
    //2、两个指针变量之间的关系运算
    // p1 > p
    //1    表示p1在高位
    //0    p在高位或者他们指向了同一个位置
    printf("p1 > p = %d\n",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\n",&a[0][1]);
    printf("a[0]+1   = %p\n",a[0]+1);
    printf("*(a[0]+1)   = %d\n",*(a[0]+1));  //3
    
    
    printf("&a[0][2] = %p\n",&a[0][2]);
    printf("a[0]+2   = %p\n",a[0]+2);
    
    //行指针  a[0]  a[1]  a[2]
    //a+1    //第二行的首地址
    //a+2    //第三行的首地址
     printf("a[1]   = %p\n",a[1]);
     printf("a+1   = %p\n",a+1);
    
     printf("a[2]   = %p\n",a[2]);
     printf("a+2   = %p\n",a+2);
    
     // a+1 第二行第一个元素的地址
     //*(a+1)  == &a[1][0]
    
    printf("*(a+1) = %p\n",*(a+1));
    printf("&a[1][0] = %p\n",&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\t",*(a[i]+j));
            printf("%d\t",*(*(a+i)+j));
        }
        
        printf("\n");
    }
    
    return 0;
}

转载于:https://www.cnblogs.com/aiti/p/4647537.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值