作者rm2slg (豪)
看板EE_DSnP
标题Re: [问题] 有关指标的问题
时间Thu Oct 7 00:36:42 2010
※ 引述《BBSealion (海狮)》之铭言:
以前就有个问题没有想清楚
刚好今天老师上到,po在这请教大家一下
---
今天宣告一个双层array :int arr[3][5] = {10,20,30, .......}
以下四行指令,竟然会显示相同的结果?
cout << &arr[0][0];
cout << &arr[0];
cout << arr[0];
cout << arr;
都一样显示出一个位址(在我家是 0x22ff10)
感觉实在挺没道理的
(1=3,2=4还算合理,但全部相同就是不太舒服orz)
也就是说arr = 0x22ff10 是一个位址
但用*取arr的值的话(*arr)还是会出现同样的东西(地址) *arr = arr = 0x22ff10
再取一次(**arr)才会给你arr[0][0]的值(ex:10)
这样不会有记忆体位址打架的问题吗!?
同样对0x22ff10这个位址,用*取值,一次还是给我0x22ff10,一次却给我该位址的值
记忆体排列如下:
arr
↓
arr[0][0] arr[0][1] ... arr[1][0] arr[1][1] ...
取出arr[0][0]的位置,等於取出arr整个阵列的头位置
同时你也可以说是arr[0](有5个变数的阵列,arr[0][0] arr[0][1] ... arr[0][4])
这个阵列的头位置。对着arr[0]取址也就同理。
另外arr、*arr是不同的
arr是阵列名称,丢给cout会给你位置
你对arr取值的话,他会告诉你arr[0]的内容
再取一次值,才告诉你arr[0][0]的内容
ps:改用动态宣告问题就解决了
(给另任意p,q)
int **c = new int*[p];
for (int i=0;i<p;i++){
c[i] = new int[q];
for (int j=0;j<q;j++){
*(c[i]+j) = 100*i+j*j;
}
}
以下四行指令
cout << &c[0][0] ;
cout << &c[0] ;
cout << c[0] ;
cout << c ;
第一行结果=第三行结果=0x2e24a0
第二行结果=第四行结果=0x2e2470
c[0]指标
↓
c[0][0] , c[0][1] ...阵列
所以c[0][0]位置是在记忆体另外开给阵列的位置(在heap)
c[0]本身是在stack中的一个变数
c[0]存的值就是他所指到的位置,也就是c[0][0]
c是一个指标阵列,他的开头位置是c[0]
一点浅见,有请各位高手补充
※ 编辑: rm2slg 来自: 140.112.253.190 (10/07 00:44)