二维数组指针问题

对于二维数组int a[][4]来说。。有以下要点:

1、

表示形式            含义                                                 结果(举例)  备注

a                    二维数组名,指向一维数组a[0],即0行首地址  2000   行指针

a[0],*(a+0),*a   0行0列元素的地址                                   2000   列指针

a+1,&a[1]            1行首地址                                          2016   行指针

a[1],*(a+1)           1行0列元素a[1][0]的地址                     2016   

a[1]+2,*(a+1)+2,&a[1][2] 1行2列元素a[1][2]的地址          2024

*(a[1]+2),*(*(a+1)+2),a[1][2] 1行2列元素a[1][2]的值           该元素值

2、行指针与列指针:  

定义: 指向行的指针叫行指针,指向列的指针叫列指针  

关系: *行指针 <=> 列指针      &列指针 <=> 行指针

 要点: 1、行指针指向行,表示该行地址;  (行指针不指向某一具体单元,而指向行(该行首地址))     

     列指针指向列,即某个元素,代表该元素的地址     

        例如:(a+1)是行指针,它指1向行的首地址,而不是a[1][0]的地址,故:*(a+1)不是代表a[1][0]的值,    

          而是转为了列指针,代表a[1][0]的地址,而*(*(a+1)才代表a[1][0]的值;     

             a[1]是列指针,它指向1行0列元素的地址,故*a[1]即a[1][0]的值  

 2、对行指针加1,代表下一行的首地址;如(a+2)代表2行首地址     

     对列指针加1,代表下一个元素的地址;如(a[0]+5)代表元素[1][0]的地址     

3、区分  1、二维数组名代表行指针;     如:a,a+1等就是行指针,*a,*(a+1)是列指针

             2、一维数组名代表列指针:     如:对于一维数组b[4],b+1代表元素b[1]的地址

            3、注意:若将二维数组a[][4]看出数组名为a[]的一维数组,则:     a[1]代表元素a[1][0]的地址,而&a[1]则是行指针,代表1行的首地址;

程序举例: 1、 # include <stdio.h>

int main(void) {  

int a[4] = {1, 3, 5, 7};  

int (*p)[4];  //将p定义为行指针,它只能指向行,而不能指向某个元素;    //int *p[4];  //error: int *p[4]定义了一个指针数组,该数组都是int * 型,即整型指针类型  

 p = &a;

 //p = a; //error:一维数组a[4]的a为列地址,必须转为行地址&a,才能赋值给列指针;    printf("%d\n", (*p)[3]);     return 0;  }

2、 # include <stdio.h>

int main(void) {  

int i, j;

 int a[3][4] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23}; 

 int (*p)[4];  p = a;  

 printf("please input row and colum\n");  

scanf("%d%d", &i, &j);  

 printf("a[%d,%d] = %d\n", i, j, *(*(p+i)+j));  

 return 0;  }

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

注意:

 *(*(p+i)+j)) 等价于 (*(P+i))[j]  //(*(P+i))相当于一维数组名a[i];     

   不等价于*(P+i)[j]  //*(P+i)[j]相当于a[i+j][0],为什么我也不知道,运行结果是这样;        

           *(P+i)[j]不等价于*(p+i+j),*(p+i+j)是i+j行的首地址,是列地址 **********************************************************************************************************/

转载于:https://www.cnblogs.com/jzin/p/6188802.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值