数组指针和指针数组的区别,以及如何利用他们访问数组里面的元素

来源:互联网 发布:mac 应用程序图标 编辑:程序博客网 时间:2024/05/18 02:11


#数组指针和指针数组的用法c语言是学习中的难点但是理解之后接很轻松:

##1.首先数组指针是指针类型:char (*p)[2];  //代表一个指向有两个char 元素数组的指针。

##2.指针数组是指针类型:        char  *p[2];  //代表有一个数组元素,它有两个指针

   int b[2][2]={1,2,10,4};//一个二位数组   int (*p)[2];//数组指针,指向一个int [2]型的数组,   p=b;//令p指向数组a,数组名相当于&a[0][0]是整个数组的地址  //此处将数组名b的值付给了p就相当,p是数组名,            int i=0;            int j=0;             for(;i<2;i++)              for(j=0;j<2;j++)            {               cout<<p[i][j];               cout<<endl;             }            for(i=0;i<2;i++)            for(j=0;j<2;j++)             {             cout<<*(*(b+i)+j)<<endl;                     }             for(i=0;i<2;i++)              for(j=0;j<2;j++)             {             cout<<*(*(p+i)+j)<<endl;                     }执行结果:            1  2  10   4                    1  2  10   4                    1  2  10   4可以看出三种访问结构一致:即数组名b所代表的含义与数组指针变量p所表达的的含义一致,所以b[i][j]的访问结果和                 (*(p+i)+j的访问结果一致)

在此解释一下:加入数组名为a,&a和a的区别:

                            先看一段代码:

#include <stdio.h>
int main(int argc,char *argv[])
{
        char a[6]={1,2,3,4,5,6};
        int *ptr =(int *)(&a+1);   // 在此将a的地址强转成int *类型的,这样就可以通过ptr来访问地址了;
        printf("%d\n",*ptr);
        printf("%d\n%d\n",*(a+2),*(ptr+1));
        printf("%p\n",a+1);
        printf("%p\n",&a+1);
        
}

执行结果如下:

-1526726656      (1)我们可以看到   *ptr 所指向的内容是乱码,那是因为&a代表(整个数组)的地址,&a+1代表跨越整个数组的

                                      长 度(6bit)所以访问*ptr地址的内容,是不可预知的,这样做很危险;
3                            (2)a是数组第一个(元素)的地址,所以加2后将向后移动2bit    , 所以向后将访问到第三个元素是3
187848490          (3)同(1)的解释
0x7ffc7c18d071  (4)
0x7ffc7c18d076  (5)