mr_accuracy 发表于 2015-4-16 00:22:22

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

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

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

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

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

cout<<"#####################"<<endl;
      cout<<" bfirst addr b+1is"<<reinterpret_cast<unsigned long>(b+1)<<endl;
          cout<<" bfirst addr &b+1 is "<<reinterpret_cast<unsigned long>(&b+1)<<endl;
               cout<<" bfirst addr &(b+1) is "<<"error"<<endl;

                   cout<<" bfirst addr *b+1 is "<<reinterpret_cast<unsigned long>(*b+1)<<endl;
                     cout<<"b first addr *(b+1) is "<<reinterpret_cast<unsigned long>(*(b+1))<<endl;

return 0;
}


我i的执行结果是:
a first addr ais0x7fff81ba70d0
a first addr &a is 0x7fff81ba70d0
a first addr *a is 0x7fff81ba70d0
#####################
a first addr a+1is0x7fff81ba70d8
a first addr &a+1 is 0x7fff81ba70f0
a first addr &(a+1) is error
a first addr *a+1 is 0x7fff81ba70d4
a first addr *(a+1) is 0x7fff81ba70d8
b first addr bis140735369867504
b bfirst addr &b is 140735369867504
b bfirst addr *b is 0x7fff81ba70f0
#####################
bfirst addr b+1is140735369867696
bfirst addr &b+1 is 140735369868464
bfirst addr &(b+1) is error
bfirst addr *b+1 is 140735369867552
b 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这俩解引用,不太明白他们的代表的是什么意思》为什么地址还是一样的?其次 步伐怎么算的?
                              新手初学,不胜感激,求赐教


mr_accuracy 发表于 2015-4-16 12:49:01

为啥每人回答捏

ANDES 发表于 2015-4-16 14:26:35

mr_accuracy 发表于 2015-4-16 12:49
为啥每人回答捏

因为太难看。。不知道你的代码是什么意思 没有注释

mr_accuracy 发表于 2015-4-16 15:18:24

...全部是cout. 变量地址啊。。。。有这么难看么

只爱你一人 发表于 2015-4-18 09:58:01

这们小哥!*a和*b的地址是不一样的!你看错了!!!
a               first addr *a is 0x7fff81ba70d0
b   first addr *b is 0x7fff81ba70f0
看到了吗?最后两位一个是d0,一个是f0

lion丶 发表于 2015-4-19 02:23:12

看了几句我就头昏眼花 太乱了

QQ[我在线上] 发表于 2015-4-19 11:25:52

本帖最后由 QQ[我在线上] 于 2015-4-19 11:30 编辑

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

松X松 发表于 2015-4-23 10:43:51

我不知道我说的你懂不懂`` 不管1维数组``还是二维数组``在内存里面存储的结构都是一维数组的方式存储的..! 就好比a如果你看成一个矩形的队列``那么意思就是第4排的第2个元素..!!a指向的是第1个元素的地址..!!可以理解成指针..!*a   *b的意思是读取ab这两个指针指的位置的值..`步伐是根据你定义的类型来走的``比如int``类型的指针``+1后``就往后移4个字节..!
页: [1]
查看完整版本: 数组指针问题;各位大神烦请给个解释呀,实在理解不了最后一点