C++ Reference and Pointer

what is pointer

  • 形参
    • formal parameter
    • 定义时函数里面的变量
      • e.g int swao(int a, int b)
      • a和b就是形参
  • 实参
    • actual parameter
    • 在主函数里面引用的
      • e.g swap(x,y)
      • x和y就是实参,实际的值

指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void part1(){
  //basic
  //p指向变量,对p的重新复制就会改变p所指向的变量的值。
  //同样对p指向的变量重新复制也会改变*p的值
  int ptmp = 50;
  int *p;
  p = &ptmp;
  cout<<p<<endl;
  //p存放的是ptmp变量所在的地址值 
  cout<<*p<<endl;
  //50,是指储存在指针的内存地址中的值,也就是ptmp的值
  cout<<&p<<endl; 
  //p指针本身的地址值
  cout<<&ptmp; 
  //ptmp变量所在的地址值
}

指针控制循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void part2(){
  //用指针来控制循环条件
  //针对数组
  int array[20];
  int *p = array;
  int i;
  for(int j = 0; j < 20; j++)
      array[j] = j;
  cout<<endl;
  for(i = 0; i < 20; i++){
      cout<<p<<" "<<(*p)<<" ";
      p++; //指针加一
      (*p)++; //指针指向内容加一
      //如果要用指针遍历数组
      //用*(p+i)
      //应为int 的p++ = p + 2
      //int 占2byte
  }
  cout<<endl;
  //针对字符串
  char *str = "abc";
  while(*p){
      cout<<*p<<" ";
      p++;
      //可以这么做的原因是char占 1 byte
  }
}

引用

1
2
3
4
5
6
7
8
9
10
11
12
void part3(){
  //引用
  int a = 20;
  int b = 10;
  int &p = a;
  //p引用a,所以p是a的另外一个名字
  cout<<p<<endl;
  //p的值改变了
  p = b;
  //a的值也会改变
  cout<<a<<endl;
}

传参

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void swap1(int x, int y){
  cout<<"in function before swap"<<x<<" "<<y<<endl;
  int temp = x;
  x = y;
  y = temp;
  cout<<"in fuction after swap"<<x<<" "<<y<<endl;
}
void swap2(int *a, int *b){
  //temp用来存a得值
  //所以其实这里是在交换值
  int temp = *a;
  *a = *b;
  *b = temp;
}
void swap3(int &a, int &b){
  //因为这里是传引用,所以任何的改变都会改变
  int temp = a;
  a = b;
  b = temp;
}

注意事项

  • 在可以使用引用的情况下,不要用指针
  • 引用不能为空,当对象为NULL时,必须使用指针
  • 引用不允许重新赋值,当使用一个变量指向不同的对象的时候,必须使用指针
c++
Comments

Comments