指针
定义:数据类型和地址
概念:为了方便访问内存中内容,系统给每一个内存单元(字节)分配一个编号,该编号称为地址,也就是指针
指针变量
定义:类型 变量名
类型 (指针指向的类型:保存哪种数据类型变量的地址) 指针变量名;
区别开:指针变量地类型和指着变量指向的类型
指针自己的内存和和指针指向的内存
所占字节数:4个字节
指针运算符:&取地址符 获取变量地首地址
* 解析引用符 取内容 读取(写入)看指针指向的类型
小端和大端:1个变量的内存大小>=2个字节
小端:低位存在低地址,高位存在高地址
void型指针:指向任意类型
void p 不能直接读取数据、偏移
0地址:不能存储数据,可以偏移
int *p=0;NULL, nullptr
指针变量赋值的方式:
1.相同类型变量的地址
2.相同类型的指针变量;
#include <iostream>
using namespace std;
int main()
{
int n;
//定义时*没有实际意义,仅仅表示定义的是指针
int *pn;//pn的类型是int* int型指针
pn = &n;
cout << pn << endl;//指针变量指向的地址
cout << &n << endl;//变量n自己的地址
cout << &pn << endl;//指针变量自己的地址
//*pn等价于pn指向的变量n
*pn = 100;//等价于n=100;
cout << n << endl;
n = 0x12abcd34;
//第一种情况:指针指向的类型<变量的类型
//指针强转值不会改变
short *pshort = (short*)&n;
cout<<hex<< *pshort << endl;//cd34
内存图
0x8 | 0x7 | 0x6 | 0x5 | 0x4 | 0x3 | 0x2 | ox1 |
---|---|---|---|---|---|---|---|
null | null | null | null | 12 | ab | cd | 34 |
因为被强转为shor型,所以读取两个字节,就是cd34。
*pshort = 100;
cout <<n << endl;//12ab0064
内存图
0x8 | 0x7 | 0x6 | 0x5 | 0x4 | 0x3 | 0x2 | ox1 |
---|---|---|---|---|---|---|---|
null | null | null | null | 12 | ab | 00 | 64 |
因为指针改变指向,所以最后两个字节的值改变,变为100,在内存中 存储使用十六进制,100转换为64,占据一个字节,前一个字节补零。输出为12ab0064
char *pchar = (char*)&n;
cout <<hex<< (int)*pchar << endl;
内存图
0x8 | 0x7 | 0x6 | 0x5 | 0x4 | 0x3 | 0x2 | ox1 |
---|---|---|---|---|---|---|---|
null | null | null | null | 00 | 00 | 00 | 64 |
*pshort = 100;
cout << n << endl;
因为转换为int型,int型占四个字节,所以高位补0,结果为00000064,为64。
0x8 | 0x7 | 0x6 | 0x5 | 0x4 | 0x3 | 0x2 | ox1 |
---|---|---|---|---|---|---|---|
null | null | null | null | 12 | ab | 34 | cd |
null | null | null | null | 12 | ab | 34 | 11001101 |
null | null | null | null | 11111111 | 11111111 | 11111111 | 11001101 |
因为字节数低类型转换为高类型,所以高位补符号位结果为FFFFFFcd
cout << dec << (int)*pchar << endl;
0x8 | 0x7 | 0x6 | 0x5 | 0x4 | 0x3 | 0x2 | ox1 |
---|---|---|---|---|---|---|---|
null | 12 | ab | 34 | <