注册 登录
编程论坛 C++教室

指针问题

aiyinsitan 发布于 2010-12-01 21:23, 547 次点击
#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 是怎么来的啊??

  
9 回复
#2
木头lbj2010-12-01 22:38
你是想问什么问题呢?说具体点。。
#3
aiyinsitan2010-12-01 23:06
运行结果是:
*((int *)p)=33
*q=12
我是想问他的这个程序的具体指针操作。
#4
rainbow12010-12-02 13:22
#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了。
#5
zhoufeng19882010-12-02 13:36
我用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 编辑 ]
#6
laoyang1032010-12-02 13:47
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了
这代码是谁写的!!!!!!!!!!!!   哪有这么用指针的!!!!!!!
考谁呢!!!!!!!!!!  好累  楼主觉得合适就给点分  在此谢过了

#7
laoyang1032010-12-02 13:49
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了
这代码是谁写的!!!!!!!!!!!!   哪有这么用指针的!!!!!!!
考谁呢!!!!!!!!!!  好累  楼主觉得合适就给点分  在此谢过了

#8
zhoufeng19882010-12-02 16:20
我说怎么回事呢..

原来是我改你源码了...晕
#9
aiyinsitan2010-12-02 17:26
回复 6楼 laoyang103
是书上的啊,好久没看C书了所以有些又忘记了,辛苦了非常感谢
#10
kittel2010-12-02 18:18
回复 6楼 laoyang103
厉害了,学习了。。
1