C语言指针_从基础到深入(不断更新)

目录

  • 1. 初识指针
  •     1.1 什么是指针
  •     1.2  指针变量和普通变量的区别
  •     1.3 指针的符号
  •     1.4 指针使用3步骤:定义、赋值、解引用
  •     1.5 指针定义的同时进行初始化与先定义后赋值的区别
  •     1.6 常量指针
  •     1.7 指针变量类型和存储目标变量的类型要一致。
  •     1.8 定义注意事项
  • 2. 指针的作用

 

    1.1  什么是指针
         指针是个变量,这个变量存储的是其他变量在内存中的地址。
    
    1.2  指针变量和普通变量的区别
         都是变量,没有本质区别。
     
    1.3 指针的符号
          & 取地址符。取它后面跟着的变量在内存中的地址。
          * 指针符。在指针中*有2个用法,一个是定义指针,一个是解引用。

    1.4 指针使用3步骤:定义、关联、解引用
          int a = 0;
          int *p;                                     //定义
          p = &a;                                  //关联    p指针变量名,代表指针本身。     
          printf("*p = %d \n", *p);        //解引用 *p代表p指向的那个对象,这里指a
    
    1.5 指针定义的同时进行初始化与先定义后赋值的区别
          (1)定义的同时进行初始化
            int a = 0;
            int *p = &a;
            
          (2)先定义完成后赋值
            int a = 0;
            int *p = NULL;                //这里用NULL,是为了避免野指针
            p = &a;                           //*p = &a;  是错误的
    
    1.6 常量指针

         区分当前表达式const对哪个起作用的方法:要看const的右边离的最近的是* 还是指针变量名。
         
         (1) 如果是*,则代表指针指向的那个变量的值是常量,不可修改。如以下2个表达式,const右边都是*,效果是一样的,写法不同而已。
                int a = 0;
                const int * p1 = &a ;     //表达式1
                int const * p2 = &a;      //表达式2
                *p1 = 3;                         //错误的,不可修改            编译器:error: assignment of read-only location ‘*p1’
                *p2 = 6;                         //错误的,不可修改            编译器:error: assignment of read-only location ‘*p2’
                
         (2) 如果const的右边最近的是指针变量名,则代表指针本身储存的地址不可修改,指针一开始指向的是啥就是啥,以后都不能变。
                int a = 0, b = 0;
                int * const p;
                p = &b;                           // 错误,不可修改。            编译器: error: assignment of read-only variable ‘p’
    
         (3) 2个const
                const int * const p;        //指针本身不可修改,指向的变量的值也不可修改。
    
    1.7 指针变量类型和存储目标变量的类型要一致。
        如:int a = 0;                         //int 类型
            int *p = &a;                         // int *类型,表示指向的那个变量的类型是int类型
            printf("result=%d \n", *p);
           
            char a[10]="hello";
            char *p = a;
            printf("result=%s \n", p);     //这里不用*p,字符串直接用指针变量名。
            
            
    1.8 定义注意事项
        同时定义多个变量时,*号只对前面这个变量起作用。
        如:char *a = "A", b ='B';                //分开写:char *a = "A"; char b='A';        
            char *a = "A", *b = "B";            //分开写:char *a; char *b ="A";
            
            
2. 指针的作用
     
      经典例子:互换A、B 两个变量的值
        void exchange(int a, int b)
        {
            int tmp;
            tmp = a;
            a = b;
            b = tmp;
            
            printf("a = %d b = %d \n", a, b);            //运行结果:a = 2 b = 1 
        }

        int main(void)
        {
            int a = 1;
            int b = 2;
            
            exchange(a, b);        
            printf("a = %d b = %d \n", a, b);            //运行结果:a = 1 b = 2    
            
            return 0;
        }

        通过运行结果可知,exchange函数中a、b的值确实对换了,但是在main中再打印时,却还是对换前的值。
        main中的exchange函数的调用,其实只是把a、b复制了一个副本并传入exchange函数,函数中只是对这个副本进行了操作,与原本的a、b无关。所以在main中打印出a、b的值还是原来的。
        如果想真的修改a、b的值,就得使用指针的方式:
        
        void exchange(int *a, int *b)
        {
            int tmp;
            tmp = *a;
            *a = *b;
            *b = tmp;
            
            printf("a = %d b = %d \n", *a, *b);            //运行结果:a = 2 b = 1 
            
        }

        int main(void)
        {
            int a = 1;
            int b = 2;
            
            exchange(&a, &b);
            
            printf("a = %d b = %d \n", a, b);            //运行结果:a = 2 b = 1 
            
            return 0;
        }
        

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值