5.指针总结
5.1 指针的定义和使用
#include<iostream>
using namespace std;
/*
5.指针总结 *操作符指向内存,&取地址
*/
int main()
{
int a = 15;
//定义
int *p = NULL;
//取地址给指针
p = &a;
//*取值
cout<<"指针的地址:"<<p<<endl;
cout<<"取内容:"<<*p<<endl;
if(p != NULL)
{
p = NULL;
}
cout<<"指针的地址:"<<p<<endl;
return 0;
}
5.2 指针的大小
32位系统:4字节,64位操作系统:8字节
sizeof()测的是指向指针存储地址的大小。
5.3 野指针、空指针、万能指针
- 野指针
指针也是一种变量,可以赋值,当指针指向区域未知时,本身不会直接引发错误;但是操作野指针指向的内存区域才会出问题。 - 空指针
int *p = NULL; 它是一个值为 0 的宏常量。 - 万能指针
void* 可以指向任何变量的内存空间。
指向变量时最好限定指针为void*
例如:
#include<iostream>
using namespace std;
/*
5.野指针、空指针和万能指针
*/
int main()
{
void *p = NULL;
int a = 0;
//指向变量时最好转为void*
p = (void*)&a;
//指向内存时转换为 int*
*(int*)p = 15;
cout<< a<<endl;
return 0;
}
5.4 const修饰的指针变量(结合方向)
#include<iostream>
using namespace std;
/*
5.4 const修饰的指针变量
*/
int main()
{
int a = 99;
int b = 89;
const int* p = &a; //不能通过指针修改内存的值。 指向常量的指针。
a = 22;
cout<<a;
/* 指针常量 */
int* const p1 = &b;
// p = &a; //不能修改指针的指向
return 0;
}
5.5 引用
- 引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。
- C++ 引用 vs 指针
引用很容易与指针混淆,它们之间有三个主要的不同:
- 不存在空引用。引用必须连接到一块合法的内存。
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
- 引用必须在创建时被初始化。指针可以在任何时间被初始化。
int& r = i;
double& s = d;
5.5.1 引用作为函数参数
#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;
}
5.5.2 引用作为函数返回值
-引用的返回相当于一个隐式的指针, 静态变量引用会有返回值,对全局或者静态变量的引用才是安全的,局部变量引用返回会出问题。
int& func() {
int q;
//! return q; // 在编译时发生错误
static int x;
return x; // 安全,x 在函数作用域外依然是有效的
}
5.5.3 获取当前系统日期和时间
//补充自:https://www.runoob.com/cplusplus/cpp-date-time.html
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
// 基于当前系统的当前日期/时间
time_t now = time(0);
// 把 now 转换为字符串形式
char* dt = ctime(&now);
cout << "本地日期和时间:" << dt << endl;
// 把 now 转换为 tm 结构
tm *gmtm = gmtime(&now);
dt = asctime(gmtm);
cout << "UTC 日期和时间:"<< dt << endl;
}