| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 547 人关注过本帖
标题:指针问题
只看楼主 加入收藏
aiyinsitan
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:183
专家分:177
注 册:2010-4-22
结帖率:89.47%
收藏
已结贴  问题点数:20 回复次数:9 
指针问题
#include "iostream.h"
void main()
{
    int a[3][4]={6,29,22,12,5,18,21,36,33,19,66,32};
    int i,j=0,(*p)[4]=a,*q=a[0];
    for(i=0;i<3;i++)
    {
        if(i==1)
        (*p)[i+i/2]=*q+1;
        else
            p++;++q;
    }
    cout<<"a[i][j]\n";
    for(i=0;i<3;i++)
    cout<<a[i][i]<<" ";
    cout<<endl;
    cout<<"*((int *)p)="<<*((int *)p)<<"* q="<<*q<<endl;

  }
*((int *)p)=33
*q=12 是怎么来的啊??

  
搜索更多相关主题的帖子: 指针 
2010-12-01 21:23
木头lbj
Rank: 7Rank: 7Rank: 7
来 自:黄山
等 级:黑侠
威 望:1
帖 子:269
专家分:527
注 册:2010-11-6
收藏
得分:0 
你是想问什么问题呢?说具体点。。

。。。!!!)))000
2010-12-01 22:38
aiyinsitan
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:183
专家分:177
注 册:2010-4-22
收藏
得分:0 
运行结果是:
*((int *)p)=33
*q=12
我是想问他的这个程序的具体指针操作。
2010-12-01 23:06
rainbow1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:277
专家分:839
注 册:2010-5-19
收藏
得分:2 
#include "iostream.h"
void main()
{
    int a[3][4]={6,29,22,12,5,18,21,36,33,19,66,32};
    int i,j=0,(*p)[4]=a,*q=a[0];
    for(i=0;i<3;i++)
    {
        if(i==1)
//在这里加一句话,把每一次的结果显示出来,
       {
           (*p)[i+i/2]=*q+1;
            cout<<"*((int *)p)="<<*((int *)p)<<"* q="<<*q<<endl;
        }

//
        else
        {
             p++;++q;
// 这里再加一句,
            cout<<"*((int *)p)="<<*((int *)p)<<"* q="<<*q<<endl;
         }  
    }
    cout<<"a[i][j]\n";
    for(i=0;i<3;i++)
    cout<<a[i][i]<<" ";
    cout<<endl;
    cout<<"*((int *)p)="<<*((int *)p)<<"* q="<<*q<<endl;

  }


注意标红的语句,这样你可以看到每一次指针变化的结果。再仔细分析一下应OK了。
2010-12-02 13:22
zhoufeng1988
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:北京
等 级:贵宾
威 望:27
帖 子:1432
专家分:6329
注 册:2009-5-31
收藏
得分:5 
我用MinGW编译了你的程序,结果是:
*( ( int *)p) = 33
*q = 22
程序代码:
#include "iostream.h"

int main()
{
  int a[3][4]={6,29,22,12,5,18,21,36,33,19,66,32};                    /*定义一个3 * 4的二维数组*/
  int i,j=0,(*p)[4]=a,*q=a[0];                                        /*定义一个指向一个长度为4的数组的指针p,定义一个指针q,指向a数组的首地址*/
  for( i = 0; i < 3; i++)
  {
      if( i == 1)
      {
          (*p)[i+i/2]=*q+1;                                                                       
      }
      else
      {
          p++;                                                       
          ++q;                                                            
      }
  }
  cout<<"a[i][j]\n";

 
  for(i=0;i<3;i++)
  {
      for ( j = 0; j < 4; j++)
      {
          cout << a[i][j] <<" ";
      }
      cout << endl;
  }
  cout<<endl;
  cout<<"*((int *)p)="<<*((int *)p)<<"* q="<<*q<<endl;

 
  return 0;
}

/*
i = 0时, p++ >>> p此时为a[1]的地址,++q >>> q此时为a[0][1]的地址. a[3][4]={6,29,22,12, 5,18,21,36, 33,19,66,32}
i = 1时, (*p)[i+i/2] >>> p为a[1][1]的地址, 把a[0][1]赋值给a[1][1]. a[3][4]={6,29,22,12, 5,30,21,36, 33,19,66,32}
i = 2时, p++ >>> p此时指向a[2][1]的地址, ++q >>> q此时为a[0][2]的地址.

故p = 33, q = 22
*/
这样用指针容易迷糊的。
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 zhoufeng1988 于 2010-12-2 16:10 编辑 ]
2010-12-02 13:36
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:13 
int i,j=0,(*p)[4]=a,*q=a[0];
首先给你解释这句话  前面的 i j不解释  
(*p)[4]=a 这句话相当于  int (*p)[4]=a;
他的意思是定义了指向 长度为4的 整形数组 的指针p
那么a是一个指向长度为4的整形数组的二级指针   那么p=a;
p也就指向了该数组(但也是二级指针)   
int *q=a[0];这句话的意思是定义整形指针q  a是二级指针  那么a[0]还会是指针  a[0]
指向了第一个长度为4的整形数组  所以q也就指向了第一个长度为4的整形数组
if(i==1)
   (*p)[i+i/2]=*q+1;
这句话的意思是  首先p是一个二级指针那么*p也是第一个长度为4的整形数组的首地址那么
(*p)[i]也就是第一个长度为4的整形数组的第i个元素 如果i等于1 那么i+i/2=1+0=1 而且根据后面的
else语句 p 要指向下一个长度为4的整形数组  q要指向第一个长度为4的整形数组的下一个元素也就是 a[0][1]
所以(*p)[i+i/2]  相当于 a[1][1]也就是18  而a[0][1]=29 再加1也就是30了  所以
现在的数组就变成了a[3][4]={6,29,22,12, 5,30,21,36, 33,19,66,32};
for(i=0;i<3;i++)
    cout<<a[i][i]<<" ";这句话当然就是输出 6  30 66
*((int *)p)这句的意思是把p强制转化成指向整形的一级指针 因为前面的循环p++
此时p指向的是最后一个长度为4的整形数组  那么*p就是33了  同理*q 经过q++之后也就指向了
第一个长度为4的整形数组的最后一个元素   *q 也就是12了
这代码是谁写的!!!!!!!!!!!!   哪有这么用指针的!!!!!!!
考谁呢!!!!!!!!!!  好累  楼主觉得合适就给点分  在此谢过了


                                         
===========深入<----------------->浅出============
2010-12-02 13:47
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
int i,j=0,(*p)[4]=a,*q=a[0];
首先给你解释这句话  前面的 i j不解释  
(*p)[4]=a 这句话相当于  int (*p)[4]=a;
他的意思是定义了指向 长度为4的 整形数组 的指针p
那么a是一个指向长度为4的整形数组的二级指针   那么p=a;
p也就指向了该数组(但也是二级指针)   
int *q=a[0];这句话的意思是定义整形指针q  a是二级指针  那么a[0]还会是指针  a[0]
指向了第一个长度为4的整形数组  所以q也就指向了第一个长度为4的整形数组
if(i==1)
   (*p)[i+i/2]=*q+1;
这句话的意思是  首先p是一个二级指针那么*p也是第一个长度为4的整形数组的首地址那么
(*p)[i]也就是第一个长度为4的整形数组的第i个元素 如果i等于1 那么i+i/2=1+0=1 而且根据后面的
else语句 p 要指向下一个长度为4的整形数组  q要指向第一个长度为4的整形数组的下一个元素也就是 a[0][1]
所以(*p)[i+i/2]  相当于 a[1][1]也就是18  而a[0][1]=29 再加1也就是30了  所以
现在的数组就变成了a[3][4]={6,29,22,12, 5,30
,21,36, 33,19,66,32};
for(i=0;i<3;i++)
    cout<<a[i][i]<<" ";这句话当然就是输出 6  30 66
*((int *)p)这句的意思是把p强制转化成指向整形的一级指针 因为前面的循环p++
此时p指向的是最后一个长度为4的整形数组  那么*p就是33了  同理*q 经过q++之后也就指向了
第一个长度为4的整形数组的最后一个元素   *q 也就是12了
这代码是谁写的!!!!!!!!!!!!   哪有这么用指针的!!!!!!!
考谁呢!!!!!!!!!!  好累  楼主觉得合适就给点分  在此谢过了


                                         
===========深入<----------------->浅出============
2010-12-02 13:49
zhoufeng1988
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:北京
等 级:贵宾
威 望:27
帖 子:1432
专家分:6329
注 册:2009-5-31
收藏
得分:0 
我说怎么回事呢..

原来是我改你源码了...晕
2010-12-02 16:20
aiyinsitan
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:183
专家分:177
注 册:2010-4-22
收藏
得分:0 
回复 6楼 laoyang103
是书上的啊,好久没看C书了所以有些又忘记了,辛苦了非常感谢
2010-12-02 17:26
kittel
Rank: 2
来 自:武汉
等 级:论坛游民
威 望:1
帖 子:38
专家分:73
注 册:2010-11-19
收藏
得分:0 
回复 6楼 laoyang103
厉害了,学习了。。
2010-12-02 18:18
快速回复:指针问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038310 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved