乐趣区

关于c:C进阶26指针的本质分析

Summary

1)指针的实质是变量 ,非凡在于 存储的内容是一段内存地址

2)在指针 申明时 * 号 示意所申明的 变量为指针 ;在指针 应用时 * 号 示意取指针所指向的 内存空间中的值

3)指针作为函数参数:

  • 指针是变量,因而能够申明 指针参数
  • 当一个函数体外部须要 扭转实参的值
  • 则须要应用指针参数;函数调用时 实参值将复制到形参
  • 指针实用于 简单数据类型作为参数 的函数中

4)口诀:左数右指 — 当const 呈现在 * 号左侧 时,指向的 数据为常量 ;当const 呈现在 * 号右侧 时,指针为常量

const int* p;        // 指针 p 可变,指向的数据 * p 不可变
int const* p;        // 指针 p 可变,指向的数据 * p 不可变
int* const p;        // 指针 p 不可变,指向的数据 * p 可变
const int* const p;  // 指针 p 不可变,指向的数据 * p 也不可变

指针的实质剖析

问题:程序中的 变量 只是 一段存储空间的别名,那么是不是必须通过这个别名能力应用这段存储空间?

1、指针的申明和应用

上面的程序输入什么?为什么

int i = 5;
int* p = &i;

printf("%d, %p\n", i, p);    // 5, 0XBFDB216C

*p = 10;

printf("%d, %p\n", i, p);    // 10, 0XBFDB216C
  • 在指针 申明时 * 号 示意所申明的 变量为指针
  • 在指针 应用时 * 号 示意取指针所指向的 内存空间中的值

2、传值调用和传址调用

  • 指针是变量,因而能够申明 指针参数
  • 当一个函数体外部须要 扭转实参的值,则须要应用指针参数
  • 函数调用时 实参值将复制到形参
  • 指针实用于 简单数据类型作为参数 的函数中

    // 指针作为参数剖析
    void swap1(int a, int b)
    {
      int t = a;
      a = b;
      b = a;
    }
    
    void swap2(int* pa, int* pb)
    {
      int t = *pa;
      *pa = *pb;
      *pb = t;
    }
    
    int main()
    {
      int a = 1, b = 2;
    
      swap1(a, b);                 // 将实参 a 和 b 的值,赋值给 swap1 参数 a、b,函数外部理论批改的是函数的形参 a 和 b,不会影响实参
      printf("%d, %d\n", a, b);    // 1, 2
      
      swap2(&a, &b);               // 将实参 a 和 b 的地址,赋值给参数指针 pa 和 pb,函数外部应用 * 号关上了这两个地址,并批改了外面的值,所以里面的实参也会变
      printf("%d, %d\n", a, b);    // 2, 1
      return 0;
    }

3、const 和指针

口诀:左数右指 — 当const 呈现在 * 号左侧 时,指向的 数据为常量 ;当const 呈现在 * 号右侧 时,指针为常量

const int* p;        // 指针 p 可变,指向的数据 * p 不可变
int const* p;        // 指针 p 可变,指向的数据 * p 不可变
int* const p;        // 指针 p 不可变,指向的数据 * p 可变
const int* const p;  // 指针 p 不可变,指向的数据 * p 也不可变

本文总结自“狄泰软件学院”唐佐林老师《C 语言进阶课程》。
如有错漏之处,恳请斧正。

退出移动版