定义3个变量并赋值,现有一个指向最后定义的变量的指针,请使用这个指针访问所有的3
5个回答
展开全部
这个也不是办不到,要根据编译器和cpu/操作系统的特性来做。
要考虑的情况比较多比较复杂。
1。如果是嵌入式系统里面的静态变量,那么可以查看编译器生成的map文件,找到3个变量存放的地址,然后直接对该地址进行读写,这样1个指针都不需要了。
2。如果是局部变量,在栈中分配,这3个变量又在同一环境中使用(同一函数体或局部程序库),那么你可以根据栈增长的特性结合该指针来推算出其他变量的地址,对该地址进行读写。
3。如果是操作系统中用malloc从堆里面进行分配,那么无法进行访问。堆存在空间碎片问题,分配的地址在运行过程中很可能不是连续分配的。
要考虑的情况比较多比较复杂。
1。如果是嵌入式系统里面的静态变量,那么可以查看编译器生成的map文件,找到3个变量存放的地址,然后直接对该地址进行读写,这样1个指针都不需要了。
2。如果是局部变量,在栈中分配,这3个变量又在同一环境中使用(同一函数体或局部程序库),那么你可以根据栈增长的特性结合该指针来推算出其他变量的地址,对该地址进行读写。
3。如果是操作系统中用malloc从堆里面进行分配,那么无法进行访问。堆存在空间碎片问题,分配的地址在运行过程中很可能不是连续分配的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果3个变量不是一个数组里的元素;不可能访问
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不能访问的,如果是数组 可以用指针访问
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
二维数组行首地址
二维数组各元素按行排列可写成如图7.7所示矩阵形式,若将第i行中的元素a[i][0]、a[i][1]、a[i][2]组成一维数组a[i] (i=0,1,2),则二维数组a[3][3]可看成是由三个一维数组元素a[0]、a[1]、a[2]组成。即:a[3][3]=(a[0],a[1],a[2]),其中:a[0]、a[1]、a[2]是分别表示二维数组a[3][3]的第0、1、2行元素。
即:a[0]=(a[0][0],a[0][1],a[0][2])
a[1]=(a[1][0],a[1][1],a[1][2])
a[2]=(a[2][0],a[2][1],a[2][2])
因为数组名可用来表示数组的首地址,所以一维数组名a[i]可表示一维数组 (a[i][0],a[i][1],a[i][2])的首地址a[i][0],即可表示第i行元素的首地址。因此,二维数组a中第i行首地址(即第i行第0列元素地址)可用a[i]表示。
由例 7.6可知,一维数组的第i个元素地址可表示为:数组名+i。因此一维数组a[i]中第j个元素a[i][j]地址可表示为:a[i]+j ,即:二维数组a中第i行第j列元素a[i][j]的地址可用a[i]+j来表示,而元素a[i]][j]的值为:*(a[i]+j)。
【例7.8】定义一个3行3列数组,输出每行的首地址及所有元素值。
# include iostream.h
void main(void)
{ int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
for (int i=0;i3;i++)
{ cout"a[" i"]="a[i] "="a[i][0]endl;
for (int j=0;j3;j++)
cout"a[" i"]["j"]="*(a[i]+j) "="a[i][j]endl;
}
}
程序执行后输出:
a[0]=0x0065FDD4=0x0065FDD4
a[0][0]=1=1
a[0][1]=2=2
a[0][2]=3=3
a[1]=0x0065FDE0=0x0065FDE0
a[1][0]=4=4
a[1][1]=5=5
a[1][2]=6=6
a[2]=0x0065FDEC=0x0065FDEC
a[2][0]=7=7
a[2][1]=8=8
a[2][2]=9=9
由此例输出结果可看出a[i]=a[i][0] (i=0,1,2),这表明a[i]确实可以表示第i行首地址(即第i行第0列地址)a[i][0]。
读者应注意,由于数组在内存的地址是由操作系统动态分配,因此,实际输出的各行首地址并不会如图7.5所假设的从1000到1035。通常地址用十六进制数表示,如在本例中:第0行实际首地址是:a[0]=0x0065FDD4。第1行实际首地址是:a[1]=0x0065FDE0。第2行实际首地址是:a[2]=0x0065FDEC。
二维数组各元素按行排列可写成如图7.7所示矩阵形式,若将第i行中的元素a[i][0]、a[i][1]、a[i][2]组成一维数组a[i] (i=0,1,2),则二维数组a[3][3]可看成是由三个一维数组元素a[0]、a[1]、a[2]组成。即:a[3][3]=(a[0],a[1],a[2]),其中:a[0]、a[1]、a[2]是分别表示二维数组a[3][3]的第0、1、2行元素。
即:a[0]=(a[0][0],a[0][1],a[0][2])
a[1]=(a[1][0],a[1][1],a[1][2])
a[2]=(a[2][0],a[2][1],a[2][2])
因为数组名可用来表示数组的首地址,所以一维数组名a[i]可表示一维数组 (a[i][0],a[i][1],a[i][2])的首地址a[i][0],即可表示第i行元素的首地址。因此,二维数组a中第i行首地址(即第i行第0列元素地址)可用a[i]表示。
由例 7.6可知,一维数组的第i个元素地址可表示为:数组名+i。因此一维数组a[i]中第j个元素a[i][j]地址可表示为:a[i]+j ,即:二维数组a中第i行第j列元素a[i][j]的地址可用a[i]+j来表示,而元素a[i]][j]的值为:*(a[i]+j)。
【例7.8】定义一个3行3列数组,输出每行的首地址及所有元素值。
# include iostream.h
void main(void)
{ int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
for (int i=0;i3;i++)
{ cout"a[" i"]="a[i] "="a[i][0]endl;
for (int j=0;j3;j++)
cout"a[" i"]["j"]="*(a[i]+j) "="a[i][j]endl;
}
}
程序执行后输出:
a[0]=0x0065FDD4=0x0065FDD4
a[0][0]=1=1
a[0][1]=2=2
a[0][2]=3=3
a[1]=0x0065FDE0=0x0065FDE0
a[1][0]=4=4
a[1][1]=5=5
a[1][2]=6=6
a[2]=0x0065FDEC=0x0065FDEC
a[2][0]=7=7
a[2][1]=8=8
a[2][2]=9=9
由此例输出结果可看出a[i]=a[i][0] (i=0,1,2),这表明a[i]确实可以表示第i行首地址(即第i行第0列地址)a[i][0]。
读者应注意,由于数组在内存的地址是由操作系统动态分配,因此,实际输出的各行首地址并不会如图7.5所假设的从1000到1035。通常地址用十六进制数表示,如在本例中:第0行实际首地址是:a[0]=0x0065FDD4。第1行实际首地址是:a[1]=0x0065FDE0。第2行实际首地址是:a[2]=0x0065FDEC。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询