指针笔记(重点)

  • 指针定义

指针的本质也是一个变量

指针存放的是变量的地址
int a = 10;//定义一个a变量
int *p = &a;//定义一个指针变量p,存放的是a变量的地址

指针变量是8个字节的整数

*(解引用运算符)
char ch = 'W';
char s;
char *p = &ch;
s = p;//p在等号右边,把p指向变量ch的值取出来
p = 'M';//p在等号右边,往p指向的变量内存中写入内容
&(取地址运算符)

  • 指针初始化

 如果一个指针没有初值化,这样的指针是野指针,里面存放的是垃圾地址

初始化直接把一个变量的地址赋给一个指针,不确定时就初始化一个空指针
int a = 23;
int p = &a;//直接给指针变量赋个变量的地址

   int *q = NULL;//给指针变量赋个空地址0x0;

注意:不要解引用一个空指针,会发生段错误!因为0号地址属于系统级的内存,不允许用户级程序访问。

  • 指针与函数

1.指针作为函数的参数

形参是实参的拷贝,更改形参的值不会改变实参的值;传指针调用不是改变实参的值,而是通过形参改变实参指向变量的值。

2.函数返回一个指针变量
  #include 
  int *simaller(int *p, int *q)
  {
     return (*p > *q ? q : p);//返回的是一个指针(地址编号)
  }
  int main(int argc, const char * argv[])
  {
    int a = 15, b = 20;
    int *p;
    //调用函数返回最小值的地址
    p = simaller(&a, &b);//用指针变量p接收
    printf("%d\n", *p);
    return 0;
  }
  输出结果为:15
3.函数指针
   #include 
  double (*fpfunc)(double a, double b);
  double add(double a, double b);
  double sub(double a, double b);
  int main( )
  {
      fpfunc = add;
      printf("%d\n", fpfunc(3.6, 4.8));//等价于add(3.6, 4.8)
      fpfunc = sub;
      printf("%d\n", fpfunc(8.5, 3.7));//等价于sub(8.5, 3.7)
      return 0 ;
      }
     double add(double a, double b)
     {
        return a + b;
     }
     double sub(double a, double b);
     {
        return a - b;
     }
  • 指针与数组

数组名字,就是数组的首元素的地址(数组首地址)
数组名是一个指针常量,存放的地址不能更改

    double b[5];
    double *p = b;
    printf("%p %p %p\n", b, p + 0, &b[0]);//三个结果相同,都是a[0]的地址
    printf("%ld %ld\n", sizeof(b), sizeof(p + 2));

可以通过下标和指针两种方式遍历数组元素

指针数组(数组中的元素是地址编号)

指针数组的定义:
类型名 *数组名[数组长度]
char str[10] = "HelloBJ";
char *ps = str + 3;//str + 3是str[3]的地址
printf("%c ", *str);//等价于str[0]
printf("%c ", *ps);
printf("%ld\n", ps - str);//ps - str 表示ps 和 str 之间相隔了多少个类型长度
输出结果为:H l 3

  • 指针常量和常量指针

指针笔记(重点)_第1张图片
Snip20160727_1.png

你可能感兴趣的:(指针笔记(重点))