指针:内存地址以字节为单位(提供操作内存的机会),在不同操作系统下;
32位cpu寻址能力2^32,指针为4个字节;
64位cpu寻址能力2^64, 指针为8字节。
指针的类型转换
#include<iostream>
int main()
{
unsigned ua{ 999 };
int a{ 666 };
int* ptrA{ &a };
unsigned* ptrUa{&ua};
ptrA = (int*)&ua;
*ptrA = -1;
/*
ptra指向ua 修改值为-1
*ptrA 作为int类型处理&ua的值
ua按unsigned处理
*/
std::cout << *ptrA<<std::endl; // -1
std::cout << ua <<std::endl; // 2^32-1
/*
ptrA int* ptrB longlong*
按照 long long
-3689348813882916865 == 0x cccc cccc ffff ffff
*/
long long* ptrB{(long long *)ptrA};
std::cout << *ptrB << std::endl;
/*
0x ff ff ff ff
char操作一位
0X 41
结果
unsigned ua= 0X ff ff ff 41
*/
char* ptrC{ (char*)ptrA };
*ptrC = 'A';
std::cout << ua << std::endl;
}
常量指针 指针常量 指向常量的常量指针
#include<iostream>
int main()
{
const int a{ 100 };
const int b{ 200 };
/*
* 常量指针
* 指向常量的指针 ,可修改指向的地址 不能修改地址里的内容
*/
const int* cptrA{&a};
int* cptr{ (int *)&cptrA };
*cptr = 300;
std::cout << *cptr << std::endl << a << std::endl; //300 100
/*
const 修饰的变量无法被修改:是const修饰的变量在编译时类似于宏被替换。强制类型转换指向其地址修改内容是成功了的。但编译时进行了类似宏的替换。在生命周期里输出变量的值未更改。而取内容发生了更改。
*/
/*
* 指针常量
* 指针是一个常量(一经初始化不可修改) 不可修改指向地址 可修改地址里的类容
*/
int* const ptrA{(int*) &a };
/*
* 指向常量的常量指针
* 都不可修改
*/
const int* const ccptr{&a};
}