指针,其值为另一个变量的地址,即内存位置的直接地址。
声明形式:如:int *p;
使用指针时会频繁进行以下几个操作:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。
#include
using namespace std;
int main ()
{
int n= 2; // 实际变量的声明
int *p; // 指针变量的声明
p = &n; // 在指针变量中存储 n 的地址
cout << "n: "<< n << endl;
// 输出在指针变量中存储的地址
cout << "n的地址: "<< p << endl;
// 访问指针中地址的值
cout << "n的值为: "<< *p << endl;
return 0;
}
结果:
n: 2
n的地址: 0x7ffc45587908
n的值为: 2
在变量声明的时候,如果没有确切的地址可以赋值,可以为指针变量赋一个 NULL 值。赋为 NULL 值的指针被称为空指针。int *p=NULL;
#include
using namespace std;
int main ()
{
int nums[3] = {10,20,30};
int *p;
// 数组中的第一个元素的地址
p = nums;
for (int i = 0; i <3; i++)
{
cout << "nums" << i << "的地址为:";
cout << p<< endl;
cout << "nums" << i << "的值为: ";
cout << *p << endl;
// 移动到下一个位置
p++;
}
return 0;
}
结果:
nums0的地址为:0x7ffd6f6e7970
nums0的值为: 10
nums1的地址为:0x7ffd6f6e7974
nums1的值为: 20
nums2的地址为:0x7ffd6f6e7978
nums2的值为: 30
同上,只需把p的指针在开始时指向数组的最后一个元素,即p=&nums[2];
然后让p--
即可。
#include
using namespace std;
int main ()
{
int nums[3] = {10, 20, 30};
int *p;
// 指针中第一个元素的地址
p = nums;
int i = 0;
for(int i=0;i<3;i++){
if(p<=&nums[2]){
cout << "nums[" << i << "]的地址为: ";
cout << p << endl;
cout << "nums[" << i << "]的值为:";
cout << *p << endl;
p++;
}
}
return 0;
}
通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。声明如下:int **p;
实例:
#include
using namespace std;
int main ()
{
int n=10;
int *p;
int **pp;
// 获取n的地址
p = &n;
// 使用运算符 & 获取 p 的地址
pp = &p;
// 使用 pp 获取值
cout << "n值为 :" << n << endl;
cout << "*p值为:" << *p << endl;
cout << "**pp值为:" << **pp << endl;
return 0;
}
结果
n值为 :10
*p值为:10
**pp值为:10
形式:
int i=17;
double d=11.7;
int &r=i;
double &s=d;
double &test(int i){
double &ref=i;
return ref;//正确
int x;
//return x;//错误
static int x;
return x;//正确
}
当返回一个引用时,要注意被引用的对象不能超出作用域。所以返回一个对局部变量的引用是不合法的,但是,可以返回一个对静态变量的引用。