指针是一个值为地址的变量,即:一个存储地址的变量。
//& 取址运算符 * 间接访问运算符/ 解引用指针
#include <iostream>
using namespace std;
int main()
{
int a=5;
double b=10.4;
//输出16进制的整形
cout<<"Address of a:"<<&a<<endl;// 0X69fefc
cout<<"Address of b:"<<&b<<endl;// 0X69fef0
cout<<"a:"<<*(&a)<<endl;// 5
// 得到指针指向的内存中的内容即地址里的内容
}
指针的创建、初始化、赋值、解引用
#include <iostream>
using namespace std;
int main()
{
int num=5;
//p_a没有初始化
int *p_a1,*p_a2;
// p_a1是int* 类型(指向int的指针)
// *p_a1是int 类型
cout<<"p_a1:"<<p_a1<<endl;//指针随机分配一个地址,创建时并未开辟空间
cout<<"p_a2:"<<p_a2<<endl;
//初始化
int *p_b=#
cout<<"p_b:"<<p_b<<endl;
//同类型指针可以赋值
//指向同一地址
p_a1=p_b;
p_a2=#
cout<<"changed p_a1:"<<p_a1<<endl;
cout<<"changed p_a2:"<<p_a2<<endl;
*p_b=12;//解引用时,保证指针有赋过地址
}
NULL指针 不指向任何东西的指针(链表经常用到)
#include <iostream>
using namespace std;
int main()
{
//测试NULL是0
//转化为NULL指针
int *p_a=0;
int *p_b=NULL;
//因为没有指向的地址,所以无法存储值即无法解引用
}
void* 存放任何类型对象的地址
#include <iostream>
int fun(int num)
{
return num+10;
}
int main()
{
double x=25.5;
//普通指针的话类型要严格保证
double *p=&x;
//void* 类型可以接受任意类型对象地址
void *p_v=&x;
void *p_v2=p;//double* 类型
std::cout<<"p_v:"<<p_v<<std::endl;
std::cout<<"p_v2:"<<p_v2<<std::endl;
//返回同一地址即时x的地址
}
指针的指针
#include <iostream>
int main()
{
int a=10;
int *p_a=&a;
int **pp_a=&p_a;//指针指向p_a指针指向的地址
cout<<"p_a:"<<p_a<<endl<<"*p_a:"<<*p_a<<endl;
cout<<"PP_a:"<<pp_a<<endl;//指针随机分配的地址
cout<<"*pp_a:"<<*pp_a<<endl;//指针指向的指针的随即地址
cout<<"**pp_a"<<**pp_a<<endl;//指针指向的指针的值
}
指针的算数运算
char a[20];
int *ptr=(int *)a; //强制类型转换并不会改变a 的类型
//指针ptr类型是int*,指向类型是int
ptr++;
//编译器处理:指针的值+sizeof(int)即4字节
//变量a地址向高地址方向增加4个字节,因为char是1字节,相当于从数组a的第0号开始的4字节移动到第4号单位开始的4字节