数组和指针

一维数组,多维数组,在内存中都是线性存储,int arr[3][6]表示有3个一维数组,每个一维数组都是6个元素。

int(*parr)[6]=arr,parr是指针,指向一维数组,一维数组有6个元素,内存只为parr分配一个空间,parr+i 只是序号,不具有实际空间。

int *p[6] 指数组,数组元素是指针,内容分配6个int*空间,p是第一个空间地址,后面按照序号

p+i访问空间。

int (*parr2)[3][6]=&arr,是两个二维数组,也是线性存储,在多维数组和指针中,*和[]作用一样,&是抵消*或[]。&,*,[]是划分地址层次,数组全部是线性存储,首地址偏移大小,决定具体数据,特别是字符串输出从哪里输出,printf("%s",偏移地址),如果是具体数字,层次主要决定是地址还是元素数值,如果*或者[]等于维度,则是元素数值,小于维度是地址。https://blog.csdn.net/sman19999/article/details/107329376

例如 int (*q)[2][5][6]=b, *b只有一个*,小于维度*+[]+[]+[]=4个*或者[],*b是地址,*b[]也是地址,**b[][]是数值,可以代码验证,int arr[3][3]={{5,9,0},{78,1,3},{0}};int (*p)[3]=arr; printf("%d,%d",p,*p,**p);

指针数组,int *p[6]元素是地址,int a[6]={0},p=&a[0],p[i]是地址,*p[i]是元素值。实例如下:

#include <stdio.h>
void  main(void){
    int arr[3]={1,3,5};
    int i=0,j=0;
    int * p=arr;
    int (*pparr)[3]=&arr;
    int *t[3]={&arr[0]};

    for(i=0;i<3;i++){  
    printf("arr=%d,arr+%d=%d;*(arr+%d)=%d\n",arr,i, arr+i,i,*(arr+i));
    printf("p=%d,p+%d=%d;*(p+%d)=%d\n",p,i,p+i,i,*(p+i));
/*数组只分配了一个变量p,其它是按照序号增加,内容并没有真的有p+i个变量空间*/

    printf("t=%d,t+%d=%d,*(t+%d)=%d,t[%d]=%d\n",t,i,t+i,i,*(t+i),i,t[i]);
/*t数组里面是指针,t与arr数组类似,t+i是地址移动,
t[i]取数组中的元素值,这个元素值是arr地址,第一个是arr的地址,其他为0.
&t与&arr类似,指一整个数组,*和&在多维数组指针时,常常代表地址偏移的大小,不是真的取变量地址。*/

     printf("(*t)+%d)=%d  *( (*t)+%d)=%d \n",i,( (*t)+i),i,*( (*t)+i));
//   for (i=0,i<3;i++) t[i]=&arr[i];printf("%d  %d",*(*(t+i)),*t[i]);
 /* 访问arr元素数值,可以用 *t[i]或者是*(*(t+i));*/
     printf("*(*pparr+%d)=%d  \n",i,*(*pparr+i));//指针指向一维数组,这个一维数组有3个int类型的元素
     printf("\n");
          }
     return ;

}

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值