参考文章(虽然部分内容有错误,但是整体讲的不错):https://mp.weixin.qq.com/s/sjqyFtXEXI6dzvWaRgk8tw
例1
int a[3] = { 1,2,3 };
cout <<"数组a第一个元素的地址:" <<&a[0] << endl;
cout <<"数组a第二个元素的地址:" <<&a[1] << endl;
输出如下:
数组a第一个元素的地址:00000080A4DDF868
数组a第二个元素的地址:00000080A4DDF86C
数组a的元素类型为int,因此相邻两个元素的地址相差4个字节。
每个元素的地址由16个十六进制数表示,每个十六进制数可由4个二进制数表示,8个二进制数占用一个字节的内存空间。因此元素的地址(即指针变量)占用8个字节的内存空间,寻址空间为B,即17179869184GB,由此可见对于64位系统的电脑内存条大小几乎无限制。
对于32位的系统每个元素的地址由8个十六进制数表示,因此元素的地址(即指针变量)占用4个字节的内存空间,寻址空间为,由此可见即使在32位系统的电脑上插上8G内存条也是没有意义的。
例2
#include <iostream>
using namespace std;
int main()
{
int a[3] = { 1,2,3 };
cout << "数组a第一个元素的地址:" << a << endl;
cout << "数组a第一个元素的地址:" << &a << endl;
cout << "数组a第一个元素的地址:" << &a[0] << endl << endl;
int b = 1;
int *c = &b;
cout << "整型变量b的地址: " << &b << endl;
cout << "指针变量c指向的整型变量b的地址:" << c <<endl;
cout << "指针变量c自身的地址: " << &c << endl <<endl;
system("pause");
}
输出如下:
数组a第一个元素的地址:000000115ABBFC38
数组a第一个元素的地址:000000115ABBFC38
数组a第一个元素的地址:000000115ABBFC38
整型变量b的地址: 000000115ABBFC64
指针变量c指向的整型变量b的地址:000000115ABBFC64
指针变量c自身的地址: 000000115ABBFC88
例3
#include <iostream>
using namespace std;
int main()
{
int a[3] = { 1,2,3 };
cout << "数组a第一个元素的地址:" << a << endl;
cout << "数组a第一个元素的地址:" << &a << endl;
cout << "数组a第一个元素的地址:" << &a[0] << endl << endl;
int(*p1)[3] = &a;
cout << "p1的地址: " << p1 << endl;
p1 = p1 + 1;
cout << "p1加1后的地址:" << p1 << endl << endl;
int *p2 = a;
cout << "p2的地址: " << p2 << endl;
p2 = p2 + 1;
cout << "p2加1后的地址:" << p2 << endl << endl;
int *p3= &a[0];
cout << "p3的地址: " << p3 << endl;
p3 = p3 + 1;
cout << "p3加1后的地址:" << p3 << endl << endl;
//int(*p1)[3] = a; 错误提示:"int *"类型的值不能用于初始化"int (*)[3]"类型的实体
//int *p2 = &a; 错误提示:"int (*)[3]"类型的值不能用于初始化"int *"类型的实体
system("pause");
}
数组a第一个元素的地址:0000006BDA6FF638
数组a第一个元素的地址:0000006BDA6FF638
数组a第一个元素的地址:0000006BDA6FF638
p1的地址: 0000006BDA6FF638
p1加1后的地址:0000006BDA6FF644
p2的地址: 0000006BDA6FF638
p2加1后的地址:0000006BDA6FF63C
p3的地址: 0000006BDA6FF638
p3加1后的地址:0000006BDA6FF63C
p1为一个指针变量,指向一个包含3个int类型数据的数组(即,数组指针),当执行p1=p1+1操作后,p1的地址值将跳过12个字节。
p2为一个指针变量,指向一个int类型数据,当执行p2=p2+1操作后,p2的地址值将跳过4个字节。
因此当指针变量自加1时,其地址值跳过多少个字节,完全取决于这个指针变量是如何定义的。