怎样理解“地址的本质是标识内存单元的无符号整数序列”?

时间:2022-12-26 01:17:40
我是初学者, megaboy在给我的帖子http://community.csdn.net/Expert/topic/4485/4485227.xml?temp=.5546381回复时说道:
“地址的本质是什么?其实是标识内存单元的无符号整数序列,正因为如此,C中的地址跟整数之间可以互相转换。”

以下内容是我对上面这句话的理解,请教大大们是不是应该这么理解上面的解释。


什么是类型?把类型理解成在内存中所能占据的“身长”这只是“类型”概念的“型”的部分,那什么是“类”呢?逻辑上所存在的共同特征都是“类”。比如:
double ar[2]={10000.0,20000.0}
ar的地址如果认为是100的话,那么ar+1的地址就是108;
ar的地址如果认为是1000的话,那么ar+1的地址就是1008;
以此类推。
是100,还是1000或是其他都不重要,重要的是相差8。也就是说,当我们说“类型double”时,谁跟谁相差8不重要,重要的是相差的是8。
由此,我们扩展一下,如果我们遇到一个二维数组,通过test代码来cout出数组的指针这一概念来。如:
int arr[2][3]={{1,2,3},{4,5,6}};
int (*pp)[3];
pp=arr;
for(int i=0;i<2;i++)
{
        cout<<(*pp)[i]<<endl<<*(*pp+i)<<endl;
        } 
getch();
return 0;
我们看到的了“指针”字眼儿,可惜屏幕没有出现我们说预料到的形式如“0xB8000000”结果,而是出现1,2,3...以此类推的整数,原因就在这。

我上面这样理解“地址的本质是什么?其实是标识内存单元的无符号整数序列,正因为如此,C中的地址跟整数之间可以互相转换。”这句话对么?如果不对,那为什么数组的指针是整型数值?

6 个解决方案

#1


我上面这样理解“地址的本质是什么?其实是标识内存单元的无符号整数序列,正因为如此,C中的地址跟整数之间可以互相转换。”这句话对么?

//有些人把指针的概念说的过于复杂晦涩 
//指针是什么就是标志地址的一个工具
//指针一旦赋值标志着指向一个地址
//地址是什么 地址是存放数据的坐标 
//地址怎么表示是通过一个字长数据内容来记录 当然可以和整数转化 

#2


假如行数无关时,定义a[][3]={1,2,3,4,5,6}与(*p)[3]={1,2,3,4,5,6}是一样的。
假如定义一维数组a[3],访问a[2]的时候,编译器会把它转化为*a+2,所以讨论数组时会与指针结合
依次,二维时,定义a[2][3],访问a[1][2]既是*(*(a+1)+2)=6.
所以你的程序里 cout<<(*pp)[i]<<endl<<*(*pp+i)<<endl;两个变量是一样的.
如果要表示的话,这样比较好:
for(int i=0;i<2;i++)
{ for(int j=0;j<3;j++)
  cout<<(*(p+i)[j])<<":"<<*(*(p+i)+j)<<endl;
}

#3


笔误,括号错了...
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
cout<<(*(pp+i))[j]<<":"<<*(*(pp+i)+j)<<endl;

#4


答案:你的理解不对。
在你的程序中出现了cout<<(*pp)[i]<<endl<<*(*pp+i)<<endl;这个语句,你认为这是个输出数组地址的语句,对吗?其实不是这样的,你定义的pp是一个指向一维数组的指针,那么*pp就是这个一维数组本身了,再取第i个元素,实际上就是arr[0][i],输出的是数组元素的值,而不是地址,所以你认为数组的地址被转换成了1,2,3这样的整数,是不对的。

再来说说你迷惑的那句话“地址的本质是什么?其实是标识内存单元的无符号整数序列,正因为如此,C中的地址跟整数之间可以互相转换。”地址跟整数的确可以互相转换,但不是你想象的那样转换,如果你学过C++,就知道,用reinterpret_cast<int>(pp);这个语句就可以把pp指向的地址转换成整数,你可以试一试。

#5


首先,楼主你的1122,不是地址,是数组中的元素哦
你的cout<<(*(p+i)[j])<<":"<<*(*(p+i)+j)<<endl;求出来的不是地址,而是数组中元素值。

for(int i=0;i<2;i++)
{
        cout<<(*pp)[i]<<endl<<*(*pp+i)<<endl;
cout<<pp + i<<endl;//求地址,pp就是地址


第二,指针变量中只能存放地址(指针),不要将一个整型量(或任何其他非地址类型的数据)赋给一个指针变量。
例如: int *p; p=100;是不合法的。

第三,地址的本质确实就是标识内存单元的无符号整数。

#6


lz得理解是有问题……没搞清楚什么是门牌与什么门牌所对应的房子,呵呵

#1


我上面这样理解“地址的本质是什么?其实是标识内存单元的无符号整数序列,正因为如此,C中的地址跟整数之间可以互相转换。”这句话对么?

//有些人把指针的概念说的过于复杂晦涩 
//指针是什么就是标志地址的一个工具
//指针一旦赋值标志着指向一个地址
//地址是什么 地址是存放数据的坐标 
//地址怎么表示是通过一个字长数据内容来记录 当然可以和整数转化 

#2


假如行数无关时,定义a[][3]={1,2,3,4,5,6}与(*p)[3]={1,2,3,4,5,6}是一样的。
假如定义一维数组a[3],访问a[2]的时候,编译器会把它转化为*a+2,所以讨论数组时会与指针结合
依次,二维时,定义a[2][3],访问a[1][2]既是*(*(a+1)+2)=6.
所以你的程序里 cout<<(*pp)[i]<<endl<<*(*pp+i)<<endl;两个变量是一样的.
如果要表示的话,这样比较好:
for(int i=0;i<2;i++)
{ for(int j=0;j<3;j++)
  cout<<(*(p+i)[j])<<":"<<*(*(p+i)+j)<<endl;
}

#3


笔误,括号错了...
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
cout<<(*(pp+i))[j]<<":"<<*(*(pp+i)+j)<<endl;

#4


答案:你的理解不对。
在你的程序中出现了cout<<(*pp)[i]<<endl<<*(*pp+i)<<endl;这个语句,你认为这是个输出数组地址的语句,对吗?其实不是这样的,你定义的pp是一个指向一维数组的指针,那么*pp就是这个一维数组本身了,再取第i个元素,实际上就是arr[0][i],输出的是数组元素的值,而不是地址,所以你认为数组的地址被转换成了1,2,3这样的整数,是不对的。

再来说说你迷惑的那句话“地址的本质是什么?其实是标识内存单元的无符号整数序列,正因为如此,C中的地址跟整数之间可以互相转换。”地址跟整数的确可以互相转换,但不是你想象的那样转换,如果你学过C++,就知道,用reinterpret_cast<int>(pp);这个语句就可以把pp指向的地址转换成整数,你可以试一试。

#5


首先,楼主你的1122,不是地址,是数组中的元素哦
你的cout<<(*(p+i)[j])<<":"<<*(*(p+i)+j)<<endl;求出来的不是地址,而是数组中元素值。

for(int i=0;i<2;i++)
{
        cout<<(*pp)[i]<<endl<<*(*pp+i)<<endl;
cout<<pp + i<<endl;//求地址,pp就是地址


第二,指针变量中只能存放地址(指针),不要将一个整型量(或任何其他非地址类型的数据)赋给一个指针变量。
例如: int *p; p=100;是不合法的。

第三,地址的本质确实就是标识内存单元的无符号整数。

#6


lz得理解是有问题……没搞清楚什么是门牌与什么门牌所对应的房子,呵呵