通过代码+注释来说明问题

#include <stdio.h>

struct box
{
int a;
int c;
box(int i,int j)
{
a=i;c=j;
}
};

void func1();
void func2(int *a,int *b);
void func3(int *p);
void func4(int &c);
void func5(int *&p);

void main()
{
func1();

int a=111;
int b=1234;
func2(&a,&b);// & 此时为取地址
printf("%d %d\n",a,b);

int *p=NULL;
func3(p);
printf("%p\n",p);

int c=1111;
func4(c);
printf("%d\n",c);

int *q=NULL;
func5(q);
printf("%p\n",q);

}

void func1()
{
int num=100;
int block=1000;
box bBOX(3,3);

// 指针是一个变量,指针变量p中存储的是(指向num代表的内存单元的)地址
int *p=#

// 引用和原来的变量num是一个东西,r和num都指的是num所代表的存储单元
int &r1=num;
box &r2=bBOX;

// 指针可以不用初始化,但引用必须初始化
int *ptrA;

// 指针可以为NULL,但是引用不可以为空
int *ptrB=NULL;

// 有const指针,但没有const引用

// 指针可以有多级指针,但是引用只能有一级
int *p1 = #
int **p2 = &p1;
int ***p3 = &p2;

// 指针的值可以改变,但是引用是不可以改变的
p=█

// sizeof(指针)得到的是指针的大小,sizeof(引用)得到的是所指变量(对象)的大小
printf("%d %d %d \n",sizeof(p),sizeof(r1),sizeof(r2));

// 指针和引用的自增(++)意义不同,引用根本不能进行自加操作
p1++;
p2++;
p3++;

// & 一定要将 引用 和 取地址 区分开

//
}

// 参数指针型形参变量,但这是一种拷贝,注意函数体内
// 修改的是指针所指的空间,不是指针本身的空间,
// 所以不要认为这不是一种拷贝
void func2(int *a,int *b)
{
int c;
c = *a;
*a = *b;
*b = c;
}

// 参数指针型形参变量,但这是一种拷贝
void func3(int *p)
{
int a=100;
p=&a;
}

// // 参数引用型(普通类型)形参变量
void func4(int &c)
{
int a=100;
c=a;
}

// 参数引用型(指针)形参变量,传递的是指针的本身,不是临时拷贝
void func5(int *&p)// 得到(取指针p的地址的)变量,操作的是存储指针变量的空间
{
int a=100;
p=&a;
}