| 
 
| 数组指针: 
 指向数组元素的指针
 
 数组指针的作用:
 
 使用数组指针间接访问数组的元素
 
 数组指针的定义:
 
 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");
 }
 
 
 
 | 
 |