博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

帅得不敢出门

热爱c++ 博客文章多为转载(帖子后面有带原文链接的)以做收藏 若有误处 望多多赐教
   stupidpig.cublog.cn
关于作者  
姓名:帅得不敢出门
职业:学生
年龄:22
位置:福州
C++高手群:3503799
个性介绍:新博客路过也帮推荐下谢谢

我的分类  




C++数组取地址的有趣问题

昨天在CSDN遇到有人说数组的地址输出问题.便自己添加了些代码测试了下.

/**************************************

帅得不敢出门

2008.5.23

若有问题 望赐教

**************************************/

#include<iostream>
using namespace std;

int main()
{
   int *p = new int[5];
   int *tp = p;
    for (int j=0; j<5; ++j)
    {
        p[j] = j;
    }
    cout << &tp << endl;//存放指针tp所在空间的地址不同于下面

    cout << &p <<endl;//存放指针p所在空间的地址
    cout << p <<endl;//申请的数组的首个元素所在空间的地址,不同于上面
    cout << &(*(p+1))<<endl;//下一个元素所在地址

    cout << p+1 << endl;//同上
    cout << p+2 <<endl;
    
    for(int i = 0 ;i < 5 ;i++)
    {
       cout << p <<endl; 

//如果是cout << &p << endl; 那么将永远是一个不变的值

//如果是&p的话,存放指针p所在空间的地址是不变的,所以你后面p++也没用,

//因为&p是不变的
       p++;
    }
    p -= 5;//Either do it or take a problem
    delete[] p;
// Don't forget to delete[] 

    int test[5] = {1,2,3,4,5};
    int *t = test;
    cout<<"\n" << &t <<endl;//存放指针t的地址

    cout<< t <<endl;//申请的数组的首个元素所在空间的地址

     //cout<< &test <<endl;//以整个数组为单位取其地址

     //cout<< &test+1 <<endl;//&test+sizeof(test)
    cout<< &t+1 << endl;//&t+4 存放指针t空间的下一个空间的地址

    cout<< &(*(t+1))<<endl;
    cout<< t+1 << endl;
    cout<< t+2 <<endl;
    
    for(int k = 0 ;k < 5 ;k++)
    {
       cout << t <<endl;
       t++;
    }

   //如果是字符数组的话又不同了

    char testa[5] = {'1','2','3','4','\0'};
    char *ta = testa;
    cout<<"\n" << &ta <<endl;//这里同上

    cout<< ta <<endl;//此处输出的是整个字符数组
    cout<< &ta+1 << endl;//存放指针ta空间的下一个空间的地址

    cout<< &(*(ta+1))<<endl;//输出除首元素之外的字符
    cout<< ta+1 << endl;//同上
    cout<< ta+2 <<endl;
    
    for(int m = 0 ; m < 4 ;m++)
    {
       cout << ta <<endl;
       ta++;
    }
    

    cout << &testa << endl;//以整个数组为单位取其地址
    cout << &testa+1 << endl;//&testa+sizeof(testa)

    return 0;
}

输出:

0012FF78
0012FF7C
00372410
00372414
00372414
00372418
00372410
00372414
00372418
0037241C
00372420

0012FF58
0012FF5C
0012FF5C
0012FF60
0012FF60
0012FF64
0012FF5C
0012FF60
0012FF64
0012FF68
0012FF6C

0012FF48
1234
0012FF4C
234
234
34
1234
234
34
4
0012FF4C
0012FF51
Press any key to continue

//如果觉得不够清楚,可以看这个代码

#include<iostream>
using namespace std;

int main()
{
   int *p = new int[5];
   int *tp = p;
    for (int j=0; j<5; ++j)
    {
        p[j] = j;
    }
    cout <<"&tp " << &tp << endl;
    cout <<"&p " << &p << endl;
    cout <<"p " << p << endl;
    cout <<"&(*(p+1)) " << &(*(p+1)) << endl;
    cout <<"p+1 " << p+1 << endl;
    cout <<"p+2 " << p+2 << endl;
    
    for(int i = 0 ;i < 5 ;i++)
    {
       cout << "p " << p <<endl;
       p++;
    }
    p -= 5;//Either do it or take a problem


    delete[] p;// Don't forget to delete[]


    int test[5] = {1,2,3,4,5};
    int *t = test;
    cout << "\n";
    cout << "&t " << &t << endl;
    cout << "t " << t << endl;
    cout << "&t+1 " << &t+1 << endl;
    cout << "&(*(t+1)) " << &(*(t+1))<< endl;
    cout << "t+1 " << t+1 << endl;
    cout << "t+2 " << t+2 << endl;
    
    for(int k = 0 ;k < 5 ;k++)
    {
       cout << "t " << t << endl;
       t++;
    }


    char testa[5] = {'1','2','3','4','\0'};
    char *ta = testa;
    cout << "\n";
    cout << "&ta " << &ta <<endl;
    cout << "ta " << ta <<endl;
    cout << "&ta+1 " << &ta+1 << endl;
    cout << "&(*(ta+1)) " << &(*(ta+1))<<endl;
    cout << "ta+1 " << ta+1 << endl;
    cout << "ta+2 " <<ta+2 <<endl;
    
    for(int m = 0 ; m < 4 ;m++)
    {
       cout <<"ta " << ta <<endl;
       ta++;
    }
    ta -= 5;
    cout << "&testa " << &testa << endl;
    cout << "&testa+1 " << &testa+1 << endl;
    return 0;
}

 

输出:

&tp           0012FF78
&p            0012FF7C
p             00372410
&(*(p+1))     00372414
p+1           00372414
p+2           00372418
p             00372410
p             00372414
p             00372418
p             0037241C
p             00372420

&t            0012FF58
t             0012FF5C
&t+1          0012FF5C
&(*(t+1))     0012FF60
t+1           0012FF60
t+2           0012FF64
t             0012FF5C
t             0012FF60
t             0012FF64
t             0012FF68
t             0012FF6C

&ta           0012FF48
ta            1234
&ta+1         0012FF4C
&(*(ta+1))    234
ta+1          234
ta+2          34
ta            1234
ta            234
ta            34
ta            4
&testa        0012FF4C
&testa+1      0012FF51
Press any key to continue

 发表于: 2008-05-23,修改于: 2008-05-24 07:27 已浏览329次,有评论1条 推荐 投诉

  网友评论
  本站网友 时间:2008-05-24 21:09:43 IP地址:60.209.128.★
不错,很详细,我是先学的C++,而现在才觉得C有很多都不明白,尤其指针和数组这块儿,这几天一直看,算是能看懂了,但写好还不行。
谢谢你的解答哈

Blog作者的回复:
不客气,有疏露之处望指出


  发表评论



Copyright © 2001-2006 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们
页面生成时间:0.3

京ICP证041476号