计算机的内存
假设机器有4GB的RAM,最底下的地址是0 然后地址向上增长
当你定义一个变量的时候,计算机会为这个变量开辟一个空间(与编译器和数据类型相关),int - 4 bytes, char - 1 byte, double - 8 bytes
用代码来讲解指针的基础功能和操作
假设 a 的地址是 204, 我们让 a = 5; 这时204~208会存入一个二进制的数字,来表示a = 5。
如何在程序中取得a的地址呢?
指针变量的使用
取地址运算符&:单目运算符&是用来取操作对象的地址。例:&i 为取变量 i 的地址。对于常量表达式、寄存器变量不能取地址(因为它们存储在存储器中,没有地址)。
指针运算符*(间接寻址符):与&为逆运算,作用是通过操作对象的地址,获取存储的内容。
例:x = &i,x 为 i 的地址,*x 则为通过 i 的地址,获取 i 的内容
我们可以对*p进行操作来修改a的值,也可以通过改变p的值来指向其他地址
int* p;
int a = 5;
p = &a;//指针p 指向 a的地址
cout << "address is " << p << endl;//输出 a 的地址
cout << "value is " << *p << endl;//输出 5
*p = 6;
cout << x;//输出6
int b;
p = &b;//指针p 指向 b的地址
cout << "address is " << p << endl;//输出 b 的地址
cout << "value is " << *p << endl;//输出 随机值(未赋值)
cout << "address is " << p << endl;//假设现在p是 204
cout << "length of int is " << sizeof(int) << bytes << endl //sizeof(int) = 4
cout << "address is " << p + 1 << endl;//因为p是int* 所以p+1就是208
cout << "value is " << *(p+1) << endl;//输出随机值 因为该地址没有被赋值
指针的类型,算术运算,和void指针
int a = 1025;
/*十进制表示如下
00000000 00000000 00000100 00000001
地址 203 202 201 200
*/
int* p ;
p = &a;// p 将取得 200,换句话说,p取得的是a的首地址 200
sizeof(int) = 4 bytes;
address(p) = 200, *p = 1025;
char* p0;
//错! p0 = p;//这是不合法的 无法通过编译 因为p是int p0是char*
p0 = char*(p);
sizeof(char) = 1 bytes;
address(p) = 200, *p0 = 1;//因为p的地址被存入了p0 所以字节地址00000001存入了p0 当我们解引用p0的时候 机器会认为他是一个指向字符型的指针 因为sizeof(char) = 1 所以机器只看了地址的第一个字节
p0 + 1 = 201, *(p0 + 1) = 4;//取的是p0的下一个地址 即201 值是 00000100
//void运算符
void* p1;
p1 = p;
//因为p1指针没有映射到任意特定的类型,不能直接解引用,*p1会出错 但是地址p1可以被传递
指针的指针
int x = 5;
int* p;//编译器会为这个变量p留出一些地址空间
p = &x;
*p = 6;
cout << x;//x = 6;
int** q;
q = &p;
//p指针存储了x的地址 而q指针存储了p的地址, 这就是指针的指针
//指针指向之处是那个变量的地址 *指针是通过那个地址来获得那个变量的值
p == x的地址
*p == x的值
q == p的地址
*q == p的值 == x的地址
*(*q) = *p == x的值
(未完待续)