数组指针和指针数组

来源:互联网 发布:nginx重启 编辑:程序博客网 时间:2024/06/15 08:28

        还好我也是接触两三年编程的人了,记得我们大一的时候很难分清楚指针数组和数组指针,其实我以前刚学的时

也不明白,我甚至好奇为什么有了指针,指针也同样可以指向数组啊?为什么还要数组指针,那么他们直接有什么

区别呢?

      指针:在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存

的地址或称为某内存单元的指针。指针是可以指向数组的头地址。

      数组指针:首先,它是一个指针,一个指向数组的指针,指向的是一个数组,而不是指向数组的开头。

      指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数

组”的简称。

      指针相对于来说还是容易理解和区分,那么数组指针和指针数组是怎么区分呢?

       想要区分数组指针和指针数组其实也是很简单的,我们只要弄清楚符号优先级的的问题就明白了 。

      例如:

            int *p1[10];

            int (*p2)[10];

“[]”的优先级比“*”要高,p1 先与“[]”结合,构成一个数组的定义,数组名为p1,int *修饰的是数组元素的类型。那现在

我们清楚,这是一个数组,其包含10 个指向int 类型数据的指针,即指针数组。至于p2 就更好理解了,“()”的优先

级比“[]”高,“*”号和p2 构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素。数组在

这里并没有名字,是个匿名数组。那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组

指针。

    有了指针和数组,我们往往就会想到指针的赋值,那么int a[10],a和&a又有什么区别呢?

          例如:

                  char a[5]={'A','B','C','D'};
                  char (*p3)[5] = &a;
                  char (*p4)[5] = a;

       上面对p3 和p4 的使用,哪个正确呢?p3+1 的值会是什么?p4+1 的值又会是什么?毫无疑问,p3 和p4 都是数组指针,指向的是整个数组。&a 是整个数组的首地址,a是数组首元素的首地址,其值相同但意义不同。在C 语言里,赋值符号“=”号两边的数据类型必须是相同的,如果不同需要显示或隐式的类型转换。p3 这个定义的“=”号两边的数据类型完全一致,而p4 这个定义的“=”号两边的数据类型就不一致了。左边的类型是指向整个数组的指针,右边的数据类型是指向单个字符的指针。虽然运行不会出现错误,但是会出现警告:


      由于&a 和a 的值一样,而变量作为右值时编译器只是取变量的值,所以运行并没有什么问题。

0 0
原创粉丝点击