• 函数中return只能返回一个值,指针可以使得函数有多个返回值。通过传指针参数,最终函数执行完毕,指针参数就相当于是返回值,调用者可以使用该指针或该指针指向的变量。
  • 指针的用途:函数返回运算状态,而运算结果通过指针返回。比如C语言中除法,用1表示成功,0表示出错。计算结果用指针参数返回。其他语言有异常机制解决类似问题。
  • 指针不能够还没赋值就去使用,比如
    int *p;
    *p = 100;
    // 这样做是错误的,程序可能正常运行,但终会出错。因为p没有指向变量
    int *p = 0;
    *p = 10; // 也是错误的
    // 下面这样做才是正确的 int a; int *p; p = &a; *p = 4;

     

  • 数组变量本身表达地址, int a[5]; int *p = a; //无需加& , 但是数组的单元表达的是变量,需要用&取地址。int *b = &a[4];
  • [] 运算符可以对数组用,也可以对指针用。
  • * 运算符可以对指针用,也可以对数组用。*a = 5; //a是数组
  • 数组变量可以理解为是const的指针,不能被赋值。意思是不能把其他变量的地址赋值给数组变量本身。可以理解为数组变量本身是一个常量。
  • 指针可以是const,指针所指也可以是const。
    •   指针是const,表示一旦得到了某个变量的地址,不能再指向其他的变量。
      int  * const p = &i;
      *p = 26; // ok
      p++; // error

       

    • 指针所指是const:表示不能通过这个指针去修改那个变量。并不能使得那个变量成为const
      const  int * p = &i;
      *p = 26// error, *p是const,但是注意i的值并不是const
      i = 26//ok
      p++; //ok
      p = &j;//ok

       

    • const 的位置不同,含义不同
      int i;
      const int * p1 = &i; // 不能通过*p1 修改i 变量的值
      int const * p2 = &i; // 不能通过*p2 修改i 变量的值
      int * const p3 = &i; // p3不能指向其他变量,只能指向i
      如何判断的?
      const在* 前面表示不能通过*p 来修改变量的值
      const 在* 后面表示指针p不能再指向其他变量

       

  • 转换:总是可以把一个非const的值转换成const的。当要传递的参数类型比地址大的时候,这是常用的手段:既能用比较少的字节数传递值给参数,又能避免函数对面的变量的修改。比如结构体,结构体传指针,如果不想函数对结构体进行修改,就可以加上const。
  • const数组,因为数组本身就不能再被赋值其他变量的地址了。所以cosnt  int a[]  =  {1,2,3,4,5};  表示数组的每个单元不能被改变,意思是1,2,3,4,5都是常量,不能被改变了。只能在初始化的时候对数组赋值。
  • 因为把数组传入函数时,传入的是地址。函数内部可以对数组进行修改,如果不想函数内部对数组进行修改,可以加上const。