鱼C论坛

 找回密码
 立即注册
查看: 1801|回复: 7

数组指针问题;各位大神烦请给个解释呀,实在理解不了最后一点

[复制链接]
发表于 2015-4-16 00:22:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 mr_accuracy 于 2015-4-16 12:50 编辑

以下是我的实验代码:
#include<iostream>

using namespace std;
int main()
{
    int a[4][2] ={{5,2},{1,4},{3,9},{1,9}};
    cout<<"a[4][2] first addr a  is"<<a<<endl;
    cout<<"a[4][2] first addr &a is "<<&a<<endl;
     cout<<"a[4][2] first addr *a is "<<*a<<endl;
     cout<<"#####################"<<endl;
     cout<<"a[4][2] first addr a+1  is"<<a+1<<endl;
    cout<<"a[4][2] first addr &a+1 is "<<&a+1<<endl;
     cout<<"a[4][2] first addr &(a+1) is "<<"error"<<endl;

    cout<<"a[4][2] first addr *a+1 is "<<*a+1<<endl;
    cout<<"a[4][2] first addr *(a+1) is "<<*(a+1)<<endl;
       int b[5][4][2][2][3] ={{5,2,1},{1,4,2},{3,9,4},{1,9,11},{124,42,123}};
         cout<<"b first addr b  is"<<reinterpret_cast<unsigned long>(b)<<endl;
             cout<<"b b[5][4][2][2][3]  first addr &b is "<<reinterpret_cast<unsigned long>(&b)<<endl;
                  cout<<"b b[5][4][2][2][3]  first addr *b is "<<*b<<endl;

cout<<"#####################"<<endl;
      cout<<" b[5][4][2][2][3]  first addr b+1  is"<<reinterpret_cast<unsigned long>(b+1)<<endl;
          cout<<" b[5][4][2][2][3]  first addr &b+1 is "<<reinterpret_cast<unsigned long>(&b+1)<<endl;
               cout<<" b[5][4][2][2][3]  first addr &(b+1) is "<<"error"<<endl;

                   cout<<" b[5][4][2][2][3]  first addr *b+1 is "<<reinterpret_cast<unsigned long>(*b+1)<<endl;
                       cout<<"b[5][4] first addr *(b+1) is "<<reinterpret_cast<unsigned long>(*(b+1))<<endl;

return 0;
}


我i的执行结果是:
a[4][2] first addr a  is0x7fff81ba70d0
a[4][2] first addr &a is 0x7fff81ba70d0
a[4][2] first addr *a is 0x7fff81ba70d0
#####################
a[4][2] first addr a+1  is0x7fff81ba70d8
a[4][2] first addr &a+1 is 0x7fff81ba70f0
a[4][2] first addr &(a+1) is error
a[4][2] first addr *a+1 is 0x7fff81ba70d4
a[4][2] first addr *(a+1) is 0x7fff81ba70d8
b first addr b  is140735369867504
b b[5][4][2][2][3]  first addr &b is 140735369867504
b b[5][4][2][2][3]  first addr *b is 0x7fff81ba70f0
#####################
b[5][4][2][2][3]  first addr b+1  is140735369867696
b[5][4][2][2][3]  first addr &b+1 is 140735369868464
b[5][4][2][2][3]  first addr &(b+1) is error
b[5][4][2][2][3]  first addr *b+1 is 140735369867552
b[5][4] first addr *(b+1) is 140735369867696


因此有如下几个问题1:针对多维数组,首地址 无论a,*a,&a我们发现其都是同一个地址,我理解虽然是同一个,但是代表意义不同,比如a+1的步伐是8字节,这里a应该把a【4】看成一个一维的数组,步伐是后面的 2*4=8,同理 b+1,1的步伐是 4*2*2*3*4=192.
                                2:&a+1,&b+1这肯定是整个数组的大小为一个步伐,所以也没疑问;
                                3:*a,*b这俩解引用,不太明白他们的代表的是什么意思》为什么地址还是一样的?其次 步伐怎么算的?
                                新手初学,不胜感激,求赐教


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-4-16 12:49:01 | 显示全部楼层
为啥每人回答捏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-16 14:26:35 | 显示全部楼层

因为太难看。。不知道你的代码是什么意思 没有注释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-16 15:18:24 | 显示全部楼层
...全部是cout. 变量地址啊。。。。有这么难看么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-18 09:58:01 | 显示全部楼层
这们小哥!*a和*b的地址是不一样的!你看错了!!!
a[4][2]                 first addr *a is 0x7fff81ba70d0
b[5][4][2][2][3]     first addr *b is 0x7fff81ba70f0
看到了吗?最后两位一个是d0,一个是f0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-19 02:23:12 | 显示全部楼层
看了几句我就头昏眼花 太乱了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-19 11:25:52 | 显示全部楼层
本帖最后由 QQ[我在线上] 于 2015-4-19 11:30 编辑

这主要是关于一个编译的安全性,
首先要知道程序内部有一个结构,用来保存语言的寻址方式和维护一些隐式的描述表,假设这个描述表被你访问并且破坏掉,那么你的 *a 所指向的内存或许没问题,那么真正的问题是 *(a +1) 这个地址的方向, 是向上找还是向下找,是 加一个字节还是 加四个字节,并且这里存不存在结构体对齐,
就结果而言,你会发现,最好的维护方法就是编译成你已经申请的内存空间,假设你指向的是一块系统的空间,如果不被你操作,那么将会丢失它的可用性,但是问题来了,如何申请一个指向系统的空间的指向?这需要你和系统打交道.在很开始学习 scanf 输入字符串的时候或许你已经早已经遇到这个问题,但是一般都是省略而过,不过还是告诉你存在这个问题,如果解释这个问题,会引出很多理论,包括系统变成和编译原理.所以,如果要深入这个问题,建议去看看有关的书籍,如果单纯是学习语言编程,就不用纠结这个问题,看到有类似情况的话,想办法躲避,
但个人认为,很多时候都不会采用这类编程
内存是一个线性结构,不存在三维空间或者多维空间,申请的空间一般都是按照程序内部结构维护,所以反编译的时候你会发现,它是一个有序的线性数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-23 10:43:51 | 显示全部楼层
我不知道我说的你懂不懂`` 不管1维数组``还是二维数组``在内存里面存储的结构都是一维数组的方式存储的..! 就好比a[4][2]如果你看成一个矩形的队列``那么意思就是第4排的第2个元素..!!  a指向的是第1个元素的地址..!!可以理解成指针..!  *a   *b  的意思是读取a  b这两个指针指的位置的值..`步伐是根据你定义的类型来走的``比如int``类型的指针``+1后``就往后移4个字节..!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 22:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表