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

        1.数组指针
        指向一个数组的指针。
       
        2.作用 : 使用数组指针间接访问数组的元素
       
        3.数组指针定义:
        int *p;
       
        4.数组指针的初始化
  1. int a[] = {1,2,3,4};
  2.         Int *p = a;//数组指针的初始化,指针变量p指向数组的第一个元素
  3.         Int * p =  &a[0];等价于上一句
复制代码


       
        5.p+1 表示访问数组a的第二个元素,同理p+1表示访问第二个元素
       
        6.误区
            p + 1不是地址的值加1。而是p的地址值加上存储单元的长度
        即 p+1 = p + 1*(sizof(数据类型))
        例如:          
  1. int a[] = {1,2,3,4};
  2.             int *p = a;
  3.             printf("p = %p\n", p);
  4.             printf("p+1 = %p", p+1);
复制代码

        打印结果:
        p = 0x7fff5fbff900
        p+1 = 0x7fff5fbff904
       
       
        7.对与一个一位数组来说
               7.1 获取a的地址有几种方法
                A, &a
                B. a+i
                C.int *p =a; p + I
                D.*(&a)
       
        8.指针的应用---逆序数组
       
        用指针将数组a中的呢个整数按反序存放
       
        例如:a [] = {1,2,3,4};存放成4,3,2,1
       
  1. void reverse(int a[], int len){
  2.             int i = 0, j = len -1;
  3.             int *p = a;
  4.             
  5.             while (i < j) {
  6.                 int temp = *(p + i);
  7.                 *(p + i) = *(p + j);
  8.                 *(p + j) = temp;
  9.                 
  10.                 i++;
  11.                 j--;
  12.             }
  13.         }
  14.        
  15.         void show(int a[], int len){
  16.             for (int i = 0; i < len; i++) {
  17.                 printf("%d ", a[i]);
  18.             }
  19.             printf("\n");
  20.         }
  21.        
  22.         int main(int argc, const char * argv[])
  23.         {
  24.        
  25.             int a[] = {1,2,3,4,5,6,7,8,9,10,11};
  26.             int len = sizeof(a)/sizeof(int);
  27.             printf("Before reverse:");
  28.             show(a, len);
  29.             
  30.             reverse(a, len);
  31.             printf("After reverse :");
  32.             show(a, len);
  33.        
  34.        
  35.             return 0;
  36.         }
复制代码

       
        打印结果:
        Before reverse:1 2 3 4 5 6 7 8 9 10 11
        After reverse :11 10 9 8 7 6 5 4 3 2 1
       
       
       
9.一维指针数组
一个数组的元素值为指针则是指针数组
格式: 类型说明符 *数组名[length]

例如 int *p[5]; 注意这个指针数组只能存储int型的指针

9.1 指针数组的使用
  1. Int a = 3, b = 4, c = 5;
  2. Int * p[3] = {&a, &b, &c};
复制代码

例如:
    i
  1. nt a = 3, b = 4, c = 5;
  2.    
  3.     int *p[] = {&a, &b, &c};
  4.     printf("&a = %p\n", &a);
  5.     printf("*p = %p\n", *p);//存储的是a的地址
  6.     printf("p = %p\n", p); //指针数组的首地址
复制代码

打印结果
&a = 0x7fff5fbff904
*p = 0x7fff5fbff904
p = 0x7fff5fbff8e0
又例如
  1.    int a[][2] = {1,2,3,4};
  2.    
  3.     int *p[2] = {a[0],a[1]};
  4.     printf("a = %p\n", a);
  5.     printf("&a[0] = %p\n", &a[0]);
  6.     printf("*p = %p\n", *p);//存储的是数组a的首地址
  7.     printf("**p = %d\n", **(p + 1)); // (p + 1)取的是p[1]的地址,*(p+1)取得是a[1]地址,**(p+1)是去a[1]的值
  8.     printf("p = %p\n", p); //指针数组的首地址
复制代码
打印结果

a = 0x7fff5fbff8f0
&a[0] = 0x7fff5fbff8f0
*p = 0x7fff5fbff8f0
**p = 3
p = 0x7fff5fbff8e0

       
       
10.指针变量之间运算
两指针变量相减所得之差事两个指针所指数组元素之间相差的元素个数。实际上是两个指针值(地址)相减之差 再除以该数组元素的长度(占用字节数)
        10.1两个指针之间的减法运算
                A.常见用法:两个指针都指向同一个数组
                        判断两个指针变量指向的元素是否连续
                        判断两个指针变量之间间隔几个元素
        例如:
          
  1. int a[][2] = {1,2,3,4};
  2.             
  3.             int *p = a[0];
  4.             int *p2 = a[1];
  5.             
  6.             printf("p = %p\n", p);
  7.             printf("p2 = %p\n", p2);
  8.             printf("p2 - p = %ld", p2 -p);
复制代码

        打印结果:
        p = 0x7fff5fbff8f0
        p2 = 0x7fff5fbff8f8
        p2 - p = 2
       
        10.2注意事项
        A.两个指针之间的减法前提是两个指针都指向同一个数组中的元素
        B.两个指针之间是没有加法的,因为相加后很有可能越界


2 个回复

倒序浏览
楼主好认真啊
回复 使用道具 举报

嗯嗯,我怕我光看视频会睡着,记者笔记会提神一些。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马