C 下标法 首地址法 指针变量法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
指针法其实就是行指针
 
#include <iostream>
using  namespace  std;
void  output_Subscript( int  p[ ][4], int  n);
void  output_Line( int  p[ ][4], int  n);
void  output_Column( int  *p, int  n);
int  main()
{
  int  a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
  cout<< "(1)下标法进行二维数组输出" <<endl;
     output_Subscript(a,3);  
     cout<< "(2)行指针法进行二维数组输出" <<endl;
     output_Line(a,3);
     cout<< "(3)列指针法进行二维数组输出" <<endl;
     output_Column(a[0],12);   
     return  0;
}
void  output_Subscript( int  p[ ][4], int  n) 
{
    int  i,j;
    for (i=0;i<n;i++)
   
     for (j=0;j<4;j++)
    cout<<p[i][j]<< " " ;
     cout<<endl;
    }
}
void  output_Line( int  p[ ][4], int  n) 
{
    int  i,j;
    for (i=0;i<n;i++)
    {
     for (j=0;j<4;j++)
      cout<<*(*(p+i)+j)<< " " ;
     cout<<endl;
    }
}
void  output_Column( int  *p, int  n) 
{
    int  i;
    for (i=0;i<n;i++)
    {
     cout<<*(p+i)<< " " ;
     if ((i+1)%4==0) 
      cout<<endl;
    }
}

首先数组的访问有三种形式:1)下标法;2)首地址法;3)指针变量法。这里我们先分析首地址法。

假设有一个二维数组a[3][4],a就是首地址,他是一个指针是一个常量,指向第一个元素的地址,也就是指向第一行的首地址,是指首行一整行,并不是指某个具体元素。那么我们称之为“行指针”。同理:a+0,a+1,a+2,都是行指针如下表所示。


但我们发现光有行指针是不能对列元素进行访问的。所以我们再来看a[0],他也就是这个数组的首地址,也就是第一个元素的地址,只不过指针方向是指向列的方向。也就是a[0]+0。a[0]和a[0]+0都是指具体的元素,那么我们称之为“列指针”,如下表所示。


那么两个概念之间的具体转换是:

*行指针----列指针

&列指针----行指针

对应关系如下表所示

根据以上转换公式:

对于元素a[1][2],其地址用列指针表示为a[1]+2,等价表示为*(a+1)+2,那么内容是*(*(a+1)+2);


提问者评价

太给力了,你的回答完美地解决了我的问题,非常感谢!
 
 
 
 
http://zhidao.baidu.com/link?url=yqLh777qX395lbkAbm2PmWHuB7kXrKPsL9vKb0LbhAlAG0r9RtUJr2NIGWwLvkFrN-WMJPwc45L7aW-xTvaM94mPxGY4mz486PMX-rdGDt3
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值