1.函数指针
编译时,系统会为每个函数分配一段存储空间,这段存储空间的首地址称为这个函数的地址,函数名表示这个地址。我们可以用指针变量来存放这个地址,这个指针变量就叫作函数指针变量,简称函数指针。
所以函数指针的定义方式为:
函数返回值类型 (* 指针变量名) (函数参数列表);
int(*p)(int, int);
定义了一个指针变量 p,该指针变量可以指向返回值类型为 int 型,且有两个整型参数的函数。p 的类型为 int(*)(int,int)。
int Func(int x); /*声明一个函数*/
int (*p) (int x); /*定义一个函数指针*/
p = Func; /*将Func函数的首地址赋给指针变量p*/
# include <stdio.h>
int Max(int, int); //函数声明
int main(void)
{
int(*p)(int, int); //定义一个函数指针
int a, b, c;
p = Max; //把函数Max赋给指针变量p, 使p指向Max函数
printf("please enter a and b:");
scanf("%d%d", &a, &b);
c = (*p)(a, b); //通过函数指针调用Max函数
printf("a = %d\nb = %d\nmax = %d\n", a, b, c);
return 0;
}
int Max(int x, int y) //定义Max函数
{
int z;
if (x > y)
{
z = x;
}
else
{
z = y;
}
return z;
}
最后需要注意的是,指向函数的指针变量没有 ++ 和 -- 运算。
2.引用
编译器不会为引用开辟新的内存空间,它不是一个变量,而是已存在变量的一个别名。它与被引用的变量共用同一块内存空间。
#include <iostream>
#include <Windows.h>
using namespace std;
//定义左值引用并初始化为变量a,以16进制打印a、temp的地址
int main()
{
int a = 23;
int& temp = a;
cout << "a:" << a << '\t' << "temp:" << temp << endl;
cout << "&a:" << std::hex << &a << '\t' << "&temp:" << &temp << endl;
system("pause");
return 0;
}
引用的特点:
- 定义引用时必须给初始化
- 没有空引用
- 没有所谓的二级引用
- 一个变量可以有多个引用(就相当于一个变量有好几个别名,这是可以的)
关于常量引用:
常引用实际上是一种万能引用
(1)引用普通变量,但是不能修改变量
(2)引用常量
(3)引用字面常量
//常量引用的格式:const int &a。
const int & a = 10;
//引用字面常量时,分两步走,首先定义一个临时量 去引用临时量 不是引用真实的字面常量10。
(4)引用其他类型的变量
double dval = 3.14;
const int& a= dval;
//实际情况为编译器生成了一个临时变量b,常量引用绑定的是临时变量b。
//const int b = dval;
//const int&a =b;
总结
int main(){
double dval = 3.14159;
const int &ir = 1024; //仅对const引用才是合法的
const int &ir2 = dval; //仅对const引用才是合法的
const double &dr = dval + 1.0; //仅对const引用才是合法的
}
关于对数组的引用:
在引用数组时,必须知道数组的大小
int main()
{
int a = 10;
int b = 10;
int ar[5] = { 1,2,3,4,5 };
int& x