1.概述
 
        地址编号:地址编号:就是计算机为了存储数据,每一个程序在32机中占4G,以一个字节为最小单位进行操作,每一个字节都有其对应的地址,该地址就是地址编。
 
        指针:地址编号的数据类型
 
        指针变量:存储地址编号的变量,其数据类型为指针 
 
在32位机中一个指针占4B 
 
 在 64 位机中一个指针占 8B 
 
 
 代码: 
 
 #include<stdio.h>
 int main(int argc, char const *argv[])
 {
     printf("char *的大小为:%ld\n",sizeof(char *));
     printf("int *的大小为:%ld\n",sizeof(int *));
     printf("short *的大小为:%ld\n",sizeof(short *));
     printf("long *的大小为:%ld\n",sizeof(long *));
     printf("float *的大小为:%ld\n",sizeof(float *));
     printf("double *的大小为:%ld\n",sizeof(double *));
     return 0;
 }
 
  
2.指针变量
 
指针变量实质上是一个变量,存放的是数据类型为指针的地址编号
 
1.定义:
 
        数据类型   变量名
 
2.分类:
 
        char *  储存数据类型为字符型的地址编号        字符指针
 
        int    *  储存数据类型为整型的地址编号            整型指针
 
        short  *储存数据类型为短整型的地址编号         短整型指针
 
        long   *储存数据类型为长整型的地址编号         长整型指针
 
        float   *储存数据类型为float的地址编号              单精度浮点型指针
 
        double *储存数据类型为double的地址编号       双精度浮点型指针
 
如:
 
        int  num = 10;
 
        int  *p ;
 
注意:
 
        如果同时定义多个指针变量的时候,每个指针变量前都要加*
 
       如:
 
        void fun()
 
        {
 
                int a,b,c;
 
                int *p1,*p2,*p3;
 
        }
 
初始化:
 
 1,当指针变量是局部变量,在其定义时没有给其值,此时系统将随机为其给一个值,这种指针称为野指针  
 
         如:  
 
         int *p;  
 
 2,当指针变量值等于NULL时,这种指针称为空指针  
 
         如:  
 
         int *p = NULL;  
 
 3,定义指针变量时赋真实的地址  
 
 如: 
 
         int num = 10;  
 
         int *p = # 
 
 如: 
 
        int num = 10;
 
        int *p ;
 
        p = #
 
运算符:
 
&
 
        作用:取地址
 
        &要取地址的变量 
 
        注意:只能获取变量的地址 
 
        代码 :
 
                #include <stdio.h> 
 
                char c = 'a'; 
 
                 int main(int argc, char const *argv[])  
 
                 {  
 
                         int num = 10;  
 
                         int *p = # 
 
                         printf("p = %p\n",p);  
 
 
                         char *p2 = &c;  
 
                         printf("p2 = %p\n",p2);  
 
 
                         //int *p3 = &10;  
 
                         const int num02 = 10;  
 
                         int *p4 = &num02;  
 
                         printf("p4 = %p\n",p4);  
 
                         return 0;  
 
                 } 
 
*
 
     作用:取值或改值
 
        *指针变量名   
 
示例 
 
        #include <stdio.h> 
 
         int main(int argc, char const *argv[])  
 
         {  
 
                 int num = 10;  
 
                 int *p = #//此时* 表示变量 p 是 int 型的指针变量  
 
                 printf("*p=%d\n",*p);//此时* 表示为取值  
 
                 *p = 1;//修改p 指向的地址的值  
 
                 printf("num=%d\n",num);  
 
                 return 0;  
 
         } 
 
 
3.指针类型
 
指针本身的类型
 
        口诀:将指针变量的变量名去除,剩余的就是指针本身的类型
 
        如:
 
                int *p1;// int * 
 
                 int **p2;//int **  
 
          
 
                 int (*p)(int int);//int (*)(int,int)  
 
 
                 ...  
 
         示例:
                 int num = 10; 
 
                 int *p = &num ; 
 
                 char *p2 = # 
 
指针指向的数据的数据类型
 
         口诀:将指针变量的变量名和与它离得最近的*去除 , 剩余的就是指针本身的类型 
 
         如: 
 
                                  int *p1;// int 
                  int **p2;//int * 
           
                  int (*p)(int int);//int (int,int)  
 取值宽度
  指针变量的数据类型的长度就是指针的取值宽度 
 char *   取值宽度 1 
 int *      取值宽度  4 
 float *   取值宽度  4 
  单位跨度(步长)
  就是地址在进行加减时,地址所增减的数据类型的长度(字节数) 
   int * 单位跨度为4字节          char * 单位跨度为1字节  
          short * 单位跨度为2字节  
          示例: 
                   #include <stdio.h>          int main(int argc, char const *argv[])  
          {  
                  int num = 0x01020304;  
                  char *p = (char* )# 
          /*  
          注意: 在 liunx 系统中数据存储将倒序  
          所以num 在内存中存储的顺序为  
          0x04 0x03 0x02 0x01  
          将num 地址强制转换为 char * 类型  
          此时取值宽度为1 字节 , 单位跨度为 1 字节  
          p为首个字节存储的地址 +1, 加的是一个单位跨度即 1 字节  
          所以从第二个字节开始取1 个字节长度的数据  
          即0x03  
          */  
                  printf("%#p\n",*(p+1));  
          /*  
          将num 地址强制转换为 short * 类型  
          此时取值宽度为2 字节 , 单位跨度为 2 字节  
          p为首个字节存储的地址 +1, 加的是一个单位跨度即 2 字节  
          所以从第三个字节开始取2 个字节长度的数据  
          即:0x0102  
          */  
                  short * p2 = (short *) # 
                  printf("%#p\n",*(p2+1));  
                  return 0;  
          } 
     
  
4.void
 
作用
 
        void与指针结合作为一种指针类型,如void *,这种指针我们称为万能指针,意味着任何一种地址都可以赋值给类型的指针变量
 
示例      
 
 #include <stdio.h>  
 
 int main(int argc, char const *argv[])  
 
 {  
 
         int num01 = 10;  
 
         char c = 'a';  
 
         short s = 1;  
 
 // 
 
         int *p1 = &num01;  
 
         char *p2 = &c;  
 
         short *p3 = &s;  
 
 // 
 
         void *p4 = &num01;  
 
         void *p5 = &c;  
 
         void *p6 = &s;  
 
         return 0;  
 
 }  
 
5.指针变量使用的注意事项
 
 1, 野指针操作会出现段错误 
 
 
        定义一个局部变量的指针,并不给其赋值,它将不知道指向哪一块地址,所以叫野指针
 
        代码:
 
                void fun01() 
 
                { 
 
                 //野指针  
 
                         int *p;  
 
                         printf("*p=%d\n",*p);  
 
                 } 
 
 
  2,空指针操作会出现段错误 
       定义一个NULL的指针,叫空指针 
          代码: 
                     void fun02()  
          {  
                  //空指针  
                  int *p = NULL;  
                  printf("*p=%d\n",*p);  
          } 
     
              3, 不要对万能指针进行操作  
           
            void fun03()  
          {  
                  int num = 10;  
                  int *p = # 
                  printf("*p=%d\n",*p);  
                  void *p2 = # 
                  printf("*p2=%d\n",*p2);  
          } 
   4, 操作指针变量不要越界  
  代码: 
            void fun04()  
          {  
                  int num = 0x01020304;  
                  int *p = # 
                  char *p2 = (char *) p;  
                  printf("%#p\n",*p2);  
                  printf("%#p\n",*(p2+1));  
                  char c = 'a';  
                  char * p3 = &c;  
                  //1  
                  int *p4 = (int *)p3;  
                  printf("%#p\n",*p4);  
          }