指针数组和数组指针

指针数组的定义形式:
     类型名 * 数组名[数组长度];
如:
     int *p[a]
数组指针的定义形式:
     类型名 (* 指针名)[数组长度];
     int (*p)[a];

指针数组,因为优先级的关系,所以p先与[]结合,说明p是一个数组,然后再与*结合说明数组p的元素是指向整形数据的指针。元素分别为p[0],p[1],….,相当于定义了8个整型指针变量。用于存放地址单元,在此,p就是数组元素为指针的数组,本质为数组。
数组指针,p先与*结合,形成一个指针,该指针指向的是有8个整型元素数组,p即为指向数组首元素地址的指针,其本质为指针。

举例说明:
int main( int argc, const char * argv[]) {

    int arr[4][4] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    int (*p1)[4];
   
int *p2[4];
   
int i,j,k;
   
    p1 = arr;
   
printf ( " 使用数组指针的方式访问二位数组 arr\n" );
   
   
for (i=0; i<4; i++) {
       
for (j=0; j<4; j++) {
           
printf ( "arr[%d][%d] = %d\t" ,i,j,*(*(p1+i)+j));
        }
       
printf ( "\n" );
    }
   
    printf ( "\n 使用指针数组的方式访问二位数组 arr\n );
    for (k=0; k<4; k++)  p2[k] = arr[k];
       
for (i=0; i<4; i++) {
           
for (j=0; j<4; j++) {
               
printf ( "arr[%d][%d] = %d\t" ,i,j,*(p2[i]+j));
            }
           
printf ( "\n" );
        }
    return 0;
}

运行结果:
使用数组指针的方式访问二位数组 arr
arr[0][0] = 0 arr[0][1] = 1 arr[0][2] = 2 arr[0][3] = 3
arr[1][0] = 4 arr[1][1] = 5 arr[1][2] = 6 arr[1][3] = 7
arr[2][0] = 8 arr[2][1] = 9 arr[2][2] = 10 arr[2][3] = 11
arr[3][0] = 12 arr[3][1] = 13 arr[3][2] = 14 arr[3][3] = 15

使用指针数组的方式访问二位数组 arr
arr[0][0] = 0 arr[0][1] = 1 arr[0][2] = 2 arr[0][3] = 3
arr[1][0] = 4 arr[1][1] = 5 arr[1][2] = 6 arr[1][3] = 7
arr[2][0] = 8 arr[2][1] = 9 arr[2][2] = 10 arr[2][3] = 11
arr[3][0] = 12 arr[3][1] = 13 arr[3][2] = 14 arr[3][3] = 15

数组指针:
     i代表行,j代表列。*(p1+i)代表指向第i行首地址的指针地址,所以*(p1+i)+j代表指向第i行第j列指针地址。用取地址符*取值,*( *(p1+i)+j )代表该指针地址对应的内容。
指针数组:
     i代表行,j代表列。 p2[i]代表指向第i行的首地址的指针地址,所以p2[i]+j代表指向第i行第j列的指针地址,用取地址符*取值,*( p2[i]+j )代表该指针地址对应的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值