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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wxh794708907 中级黑马   /  2015-7-23 18:53  /  870 人查看  /  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
回复 使用道具 举报
以后可以再来看得时候就 好看了
回复 使用道具 举报
笔记记得还可以~~
回复 使用道具 举报
明天讲指针。。加油。。。。。笔记不错
回复 使用道具 举报
不错,用心了
回复 使用道具 举报
好,我也认真学
回复 使用道具 举报
学习越来越紧张了 越来越难
回复 使用道具 举报
很好继续努力!
回复 使用道具 举报
明天指针啊 有点瘆的慌
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马