指针
      
        
          数组元素的指针
      
        
          案例1:通过数组元素指针遍历数组的元素
      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   | #include<stdio.h> int main(int argc,char *argv[]){     int arr[5] = {10,20,30,40,50};     int n = sizeof(arr) / sizeof(arr[0]);     int i = 0;     int *p = &arr[0];
      for(i = 0; i < n; i++){                  printf("arr[i]=%d ",*(p+i));                       }     printf("\n");
      return 0; }
   | 
 
运行结果:
  
        
          案例2:通过数组元素指针获取键盘输入
      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   | #include<stdio.h> int main(int argc,char *argv[]){     int arr[5] = {10,20,30,40,50};     int n = sizeof(arr) / sizeof(arr[0]);     int i = 0;     int *p = &arr[0];
      for(i = 0; i < n; i++){                  scanf("%d",p+i);     }
      for(i = 0; i < n; i++){         printf("arr[i]=%d ",*(p+i));     }     printf("\n");
      return 0; }
   | 
 
运行结果:
  
        
          案例3:问,输出的是多少?
      1 2 3 4 5 6 7 8 9
   | #include<stdio.h> int main(int argc,char *argv[]){     int arr[5] = {10,20,30,40,50};     int *p = &arr[2];     p++;     printf("%d",*(p+1)); 
      return 0; }
   | 
 
运行结果:
  
        
          数组的 [] 和 *() 的关系
      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   | #include<stdio.h> int main(int argc,char *argv[]){               int arr[5] = {10,20,30,40,50};     int *p = NULL;
      p = &arr[0];
      printf("%d\n",arr[1]);     printf("%d\n",*(arr + 1));
      printf("-----------------------------"); 
      printf("%d\n",*(1 + arr));     printf("%d\n",1[arr]);          
      return 0; }
   | 
 
运行结果:
  
        
          为啥 arr代表的是 数组第0个元素的地址
      由上面的结论可得:  
1 2 3 4
   | &arr[0] = & *(arr+0) = arr+0 = arr;
 
 
 
   | 
 
        
          总结:
      
- [] 是*() 的缩写
 
- 数组名arr代表的是数组 首元素的地址(第0个元素的地址)
 
        
          arr 和 &arr 的区别(了解)
      
        
          arr:数组的首元素地址
      
        
          &arr:数组的首地址(数组名取地址没啥意义的,这个只是一个表达式的结合)
      案例:  
1 2 3 4 5 6 7 8 9 10 11 12
   | #include<stdio.h> int main(int argc,char *argv[]){     int arr[5] = {10,20,30,40,50};          printf("arr=%u\n",arr);      printf("arr+1=%u\n",arr+1);      printf("------------------------\n");      printf("&arr=%u\n",&arr);      printf("&arr+1=%u\n",&arr+1); 
      return 0; }
   | 
 
运行结果:
  
        
          分析:
      arr+1增加了4字节,跳过1个元素
&arr+1增加了20字节,跳过5个元素即整个数组  
        
          结论:
      
- arr代表的是数组首元素的地址,+1跳过一个元素  
 
- &arr代表的是数组的首地址,+1跳过整个数组  
 
- arr和&arr在地址编号上是一样的,但是类型是完全不一样的
 
注意:数组名 arr 是个符号常量,不能被修改(赋值)  arr++ (错误)
        
          指向同一个数组的两个元素的指针变量间的关系
      案例1:问,p2-p1=?12还是3?  
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
   | #include<stdio.h> int main(int argc,char *argv){     int arr[5] = {10,20,30,40,50};     int *p1 = arr;     int *p2 = arr+3;
 
           printf("%d",p2-p1);
           if(p2>p1){         printf("p2>p1");     }else{          printf("p2<=p1");     }
           p1=p2;
           p1+p2;
           printf("%d\n",p2[-2]);     return 0; }
   | 
 
案例2:  
#include<stdio.h>
int main(int argc,char *argv){
    int arr[5] = {10,20,30,40,50};
    int *p = arr;
    printf("%d\n",*p++);
    printf("%d\n",(*p)++);
    printf("%d\n",*(p++));
    return 0;
}

讲解: