A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wxh794708907 中级黑马   /  2015-7-23 18:53  /  1136 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

数组指针:

      指向数组元素的指针

   数组指针的作用:

      使用数组指针间接访问数组的元素

   数组指针的定义:

      int *p;

   数组指针的初始化:

      int a[4]={1,2,3,4};

      int *p = a;  //数组指针,定义了一个指针变量p赋值数组的首地址(第一个元素的地址),p指向数组的第一个元素

      int *p = &a[0]; //等价上面一句话

   数组指针如何访问数组的元素:

      1)p+1   表示指向数组的下一个元素
      2)p-1   指向数组的上一个元素

总结:


      对于一个一维数组来说

        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])

应用:逆序数组:

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};
    //打印的是指针数组的第一个元素得值
    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));

两个指针变量之间的运算

    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指向了数组的第四个元素


注意:两个指针变量之间没有加法运算
如果两个指针变量指向同一个元素 那么他们相减的结果是 0
判断两个指针变量指向的元素是否相邻(连续),他们相减的结果是 1的绝对值


    //2、两个指针变量之间的关系运算
    // p1 > p  //使用大于或者小于来比较的 不是相减;
    //1    表示p1在高位(这里就是p1>p)
    //0    p在高位或者他们指向了同一个位置(这里可能是p1<p或者是p1=p)
    printf("p1 > p = %d\n",p1 > p);


数组名访问二维数组之指针在二维数组中的应用;
    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");
    }


16 个回复

倒序浏览
好详细的样子!
回复 举报
感觉好复杂哈!!!
回复 举报
LZ很用心,总结的很好!
回复 举报
不错 ,,,,,,,,,,,,,,,,
回复 举报
加油吧骚年
回复 举报
哇,膜拜啊
回复 举报
好厉害,赞赞赞
回复 举报
看起来挺不错的啊:lol
回复 举报
以后可以再来看得时候就 好看了
回复 举报
笔记记得还可以~~
回复 举报
明天讲指针。。加油。。。。。笔记不错
回复 举报
不错,用心了
回复 举报
好,我也认真学
回复 举报
学习越来越紧张了 越来越难
回复 举报
很好继续努力!
回复 举报
明天指针啊 有点瘆的慌
回复 举报
您需要登录后才可以回帖 登录 | 加入黑马