C++ 指针与引用
C++ 指针
指针的定义
指针是一个变量,它的值是另一个变量的地址,即内存位置的直接地址。
指针变量的一般声明形式:
type *var-name;
int *ip;
double *dp;
float *fp;
char *ch;
- 所有指针的值的实际数据类型都是一样的,一个代表内存地址的十六进制数。指针变量声明的不同数据类型,是所指向的变量或常量的数据类型。
指针的使用
#include <iostream>
using namespace std;
int main ()
{
int var = 20; // 实际变量的声明
int *ip; // 指针变量的声明
ip = &var; // 在指针变量中存储 var 的地址
cout << "Value of var variable: ";
cout << var << endl; //20
// 输出在指针变量中存储的地址
cout << "Address stored in ip variable: ";
cout << ip << endl; //0xbfc601ac
// 访问指针中地址的值
cout << "Value of *ip variable: ";
cout << *ip << endl; //20
return 0;
}
- 把变量地址赋值给指针
ip = &var
- 访问指针变量中保存的变量的值,使用
*ip
Null 指针
在声明指针变量时,如果没有确切的地址可以赋值,则应该为指针变量赋一个 NULL
值。NULL指针是一个定义在标准库中,值为0的常量。
#include <iostream>
using namespace std;
int main ()
{
int *ptr = NULL;
cout << ptr ; // 0
return 0;
}
指针与数组
指针和数组在很多情况下是可以互换的,可以通过指针的算术运算或数组索引来访问数组。
#include <iostream>
using namespace std;
const int MAX = 3;
int main ()
{
int var[MAX] = {10, 100, 200};
int *ptr;
// 指针中的数组地址
ptr = var;
for (int i = 0; i < MAX; i++)
{
cout << "Address of var[" << i << "] = ";
cout << ptr << endl;
cout << "Value of var[" << i << "] = ";
cout << *ptr << endl;
// 移动到下一个位置
ptr++;
}
return 0;
}
- 通过指针的算术运算来访问数组,ptr每增加一次,指向的地址位置增加4 (int类型占4个字节),即指向下一个整数。
- 数组名是一个指向数组开头的常量,不能修改 var 的值,如
var = var + 1
是非法的。
指针数组
数组存储指向 int
等数据类型的指针。
#include <iostream>
using namespace std;
const int MAX = 3;
int main ()
{
int var[MAX] = {10, 100, 200};
int *ptr[MAX];
for (int i = 0; i < MAX; i++)
{
ptr[i] = &var[i]; // 赋值为整数的地址
}
for (int i = 0; i < MAX; i++)
{
cout << "Value of var[" << i << "] = ";
cout << *ptr[i] << endl; // 10, 100, 200
}
return 0;
}
使用指向字符的指针数组来存储一个字符串列表:
const char *names[MAX] = {
"Zara Ali",
"Hina Ali",
"Nuha Ali",
"Sara Ali",
};
printf("names[0]= %s", names[0]); // Zara Ali
names[0]
为指向char
类型的指针变量,存储的是字符串首元素Z
的地址。- 为什么names[0]打印输出整个字符串呢?C规定打印字符串时用
%s
控制,对应变量那里只需要字符串的第一个字符的指针即可,直至遇到'\0'
,所以提供首字母地址即可打印字符串。
指针传递给函数
传递一个 unsigned long
类型的值的地址给 par
#include <iostream>
#include <ctime>
using namespace std;
void getSeconds(unsigned long *par);
int main ()
{
unsigned long sec;
getSeconds( &sec );
// 输出实际值
cout << "Number of seconds :" << sec << endl;
return 0;
}
void getSeconds(unsigned long *par)
{
// 获取当前的秒数
*par = time( NULL );
return;
}
数组作为参数传递给指针变量:数组名 == 数组首元素起始地址
#include <iostream>
using namespace std;
// 函数声明
double getAverage(int *arr, int size);
int main () {
// 带有 5 个元素的整型数组
int balance[5] = {1000, 2, 3, 17, 50};
double avg;
// 传递一个指向数组的指针作为参数
avg = getAverage( balance, 5 ) ;
// 输出返回值
cout << "Average value is: " << avg << endl;
return 0;
}
double getAverage(int *arr, int size) {
int i, sum = 0;
double avg;
for (i = 0; i < size; ++i) {
sum += arr[i];
}
avg = double(sum) / size;
return avg;
}
C++ 引用
引用的定义
引用变量是一个别名,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称来指向变量。
引用与指针
- 引用一旦被初始化为一个对象,就不能指向另一个对象;指针可以在任何时候指向另一个对象
- 引用创建时必须初始化;指针可以在任何时候初始化
- 不存在空的引用
引用的使用
创建引用
int a = 17;
// r为a的引用
int& r = a;
// a = r = 17
cout << a << endl;
cout << r << endl;
引用传递给函数
#include <iostream>
using namespace std;
// 函数声明
void swap(int& x, int& y);
int main ()
{
// 局部变量声明
int a = 100;
int b = 200;
cout << "交换前,a 的值:" << a << endl;
cout << "交换前,b 的值:" << b << endl;
/* 调用函数来交换值 */
swap(a, b);
cout << "交换后,a 的值:" << a << endl;
cout << "交换前,b 的值:" << b << endl;
return 0;
}
// 函数定义
void swap(int& x, int& y)
{
int temp;
temp = x; /* 保存地址 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 x 赋值给 y */
return;
}
参考文章
[1] C++指针
[2] C++引用