|
发表于 2022-9-17 11:31:04
|
显示全部楼层
本帖最后由 howzyao 于 2022-9-17 11:33 编辑
同时数组首位也是个地址,然后加一之类的就是更改地址
如果确定是数组的话,+1,就是下标+1,正是这样.可以通过 &a[x]来查看当前下标x的元素所 放的 内存地址.
结案.
上面搞清楚了后,关连紧密的另一案是下面的内容:
要注意的是:
当a[x]j中存放的是 1,2,3这样的实际数时 (可能叫做立即数,也是刚刚从坛里学到的)
那就说明 数组a 的每一个元素, 就是 一个 int变量.
这些变量,按照 int 在本机器中 固定的长度 依次排列的 所以 这时的下标每+1,就相当于
往后移动一个int长度,由此可见,此时每个元素都是有固定地址的,但这些固定地址,却没有指针,或者说,
这个地址,如oxABCD EEE1本身就是一个指针,但这个指针,并没有直观地赋给 自己定义的指针.
实验如下:
#include <iostream>
using namespace std;
int main()
{
int a[3];
a[1]=8;
cout<<"可以看到 a[1]="<<a[1]<<endl;
int *p= &a[1]; //指向中间一个元素,p有自己的 内存地址x
//a[1] 也有自己的 内存地址y
//现在,在 内存地址 的维度 令y == x 了
//现在,开始看值是否一值:
cout<<"可以看到 a[1]="<<*p<<endl;
p; //现在就等同了 &a[1]
//因为p是指针,cout函数 显示指针 变量的话
//默认是 直接输出 直接输出 指针的 值
//指针的值 是 地址 输出看看:
cout<<" p ="<<p<<endl;
//由于a[1]后面还有最后一个元素a[2]
//偏后一下p看看
p++;
cout<<" p ="<<p<<" 此时p的地上和上个地址有什么变化"<<endl;
//现在,p的地址发生了变化: +了4个字节.
//现在,再来看看a[2]的地地是什么:
cout<<"&a[2]="<<&a[2]<<" 此时右值 &a[2]的地上和上个地址有什么变化"<<endl;
//可以发现,现在p的地址 和 a[2]的地址 是同一个地址,那么得出:
//&a[2] == p
//可以看到 a[2] 是一个没有被初始的int变量,这个变量也有地址,也可以
//通过第三方指针来对访问,现在,来给这个地址中填写一个 整型值
*p = 255;
cout<<" a[2] == *p == "<<*p<<endl;
cout<<"&a[2] == p == "<< p<<endl; //请记住这两行的 * & 的使用规律. *取值 &取址
//最后提一下,a[0]的地址,和p 一样,*a == 9 == a[0] 由此可见
//数组名,就是一个指针变量,只是这个指针管理的内存长度,取决于下标
//的值.
cout << "Hello world!" << endl;
return 0;
} |
|