指针
int a = 20;//声明一个实际变量
int *p;//声明一个指针变量
p = &a;//把变量的地址赋给指针,就是在指针变量中存储a的地址
cout << p << endl;//输出指针变量中存储的地址
cout << *p << endl;//访问指针变量中地址指向的值,这里就是20
给指针赋NULL是一个良好的编程习惯,int *a = NULL
引用
int i = 42;
int &r = i;//r是一个引用,是i的小名
int *p;//p是一个指针
int *p1 = nullptr;//定义p1是一个空指针
int *p2 = &i;//这里的&在等号右边是取地址符,指针p2存放的是i的地址
*p2 = 0;//这里的*是解引用符号,得到指针p2所指的对象,也就是经p2给i赋值,解引用操作仅适用于指向了某个对象的有效指针
p1 = &adc;//p1的值被改变,现在pi指向adc
*p1 = 0;//*p1被改变,也就是指针pi指向的那个对象发生改变
函数引用传参
引用和原始变量都指向同一个地址,因此通过引用修改原始变量中存储的变量值,修改引用就是修改原始值;所以可以用于函数传递参数或函数返回值
函数引用传参,将函数的形参指定为引用,调用时就是把实参直接传递给形参,而不是拷贝给形参,所以在函数体中修改了形参,实参也会被修改
(补充一点:值传递只是简单的拷贝,不会实现交换两数的目的,因为传进去的是实参放的副本(副本啥意思,就是把实参的值拷贝一份然后传进去),在交换函数内部执行的是形参的改变,形参的改变不会影响原来的实参)
swap(num1, num2);//引用传递
void swap(int &a, int &b){
int temp = a;
a = b;
b = temp;}
//这种方式也是可以的,下面这个传的是地址
swap(&num1, &num2);
void swap(int *a, int *b){
int temp = *a;//这里尽量不要把temp作为指针,因为没有初始化很危险,当然你初始化了就是可以
*a = *b;
*b = temp;}
此文关于各种传递比较正确https://www.cnblogs.com/chen-kh/p/6696305.html
常引用:不希望通过引用来修改原始变量的值
const int &b = a;
纸上得来终觉浅,绝知此事要躬行,指针总是指来指去,还是上机看下到底怎么指
#include <iostream>
using namespace std;
int main()
{
int a[5] = {
1,3,4,6,5};
int *p = a;
cout << p<<endl;//结果为0x7ffeefbffde0
cout <<*p<<endl;//结果为1,因为数组名a相当于数组的第一个元素
p++;
cout << p<<endl;//结果为0x7ffeefbffde4,注意比刚刚的增加4,因为一个int 是4,地址虽然执行的是+1,实际是+4
cout << *p<<endl;//结果为3,,自然就是第二个元素,因为地址变了
*p++;//执行完这个语句,*p向下指一位
cout << p<<endl;//所以结果为0x7ffeefbffde8,地址又增加了4
cout << *p<<endl;//结果为4,指向的内容自然随着地址变化
(*p)++;
cout << p<<endl;//结果为0x7ffeefbffde8。地址没变,加的只是指向对象的值
cout << *p<<endl;//结果为5,这里是刚刚的4+1
*(p++);
cout << p<<endl;//结果为0x7ffeefbffdec,地址又增加了
cout << *p<<endl;//结果为6,指向的内容变化了
return 0;
}
我想通过博客帮助和我一样有困惑的小伙伴,看完此文你懂了吗,欢迎一起交流,博客仅为我个人的学习笔记,如有错误,欢迎指正