C语言 数组指针与指针数组的探讨一

来源:互联网 发布:最优化计算方法 编辑:程序博客网 时间:2024/04/29 14:25

为了理解属语言的指针数组与数组指针,特写了如下代码。然后在执行的过程中又引出个问题,看来一些多动手,才会发现原本自己觉得懂的东西原来不是那么的扎实。

且看如下代码:

正确代码:

#include <stdio.h>
int main (int argc,char * argv[])
{
    int * ParrayVal[2];/*ParrayVal[2] have three elements,each one is a (int *) pointer.*/
    int (*arrayPVal)[2]; /* arrayPVal is one pointer,pointer to a array have two int element.*/
    int a=1,b=2,c=3;
    ParrayVal[0]=&a;
    ParrayVal[1]=&b;
    ParrayVal[2]=&c;
    printf("&a=%p\n",&a);
    printf("&b=%p\n",&b);
    printf("&c=%p\n",&c);
    printf("ParrayVal[0]=%p\n",ParrayVal[0]);
    printf("ParrayVal[1]=%p\n",ParrayVal[1]);
    printf("ParrayVal[2]=%p\n",ParrayVal[2]);
    int array[2]={3,4};
    arrayPVal=&array;
    printf("array=%p\n",array);
    printf("array=%p\n",&array);
    int i=0;
    for (i;i<=1;i++)
        {
            printf("array[i]=%d\n",(*arrayPVal)[i]);
        }
    return 0;
}

错误代码:

#include <stdio.h>
int main (int argc,char * argv[])
{
    int * ParrayVal[2];/*ParrayVal[2] have three elements,each one is a (int *) pointer.*/
    int (*arrayPVal)[2]; /* arrayPVal is one pointer,pointer to a array have two int element.*/
    int a=1,b=2,c=3;
    ParrayVal[0]=&a;
    ParrayVal[1]=&b;
    ParrayVal[2]=&c;
    printf("&a=%p\n",&a);
    printf("&b=%p\n",&b);
    printf("&c=%p\n",&c);
    printf("ParrayVal[0]=%p\n",ParrayVal[0]);
    printf("ParrayVal[1]=%p\n",ParrayVal[1]);
    printf("ParrayVal[2]=%p\n",ParrayVal[2]);
    int array[2]={3,4};
    arrayPVal=array;
    printf("array=%p\n",array);
    printf("array=%p\n",&array);
    int i=0;
    for (i;i<=1;i++)
        {
            printf("array[i]=%d\n",(*arrayPVal)[i]);
        }
    return 0;
}

红色部分是这两段代码的唯一区别,如果上进去调试,这两段代码的执行结果都不会出问题。但是第二个代码会有告警。为了搞明白这个原因。同时参考了下网上各位达人的帖子总结如下。

为什么arrayPVal=array 和 arrayPVal=&array 结果是相同的,但是到底有什么差别呢?

1.他们的值确实相同,即指向的内存地址都是相同的。

2.他们的类型不同,array 通常表示数组元素的首地址,结合上述代码的描述,其退化成一个int *的指针类型。而&array表示的是一个数组指针,指向的一个int [2]的数组。

所以两者在类型上是不同的。

一个可以等价于 :int  * a;

一个是: int  (*a) [2];

-------------------以下具体也不是太清楚,请大家继续评论-----------------------------------

再说说(*arrayPVal)[i].首先 arrayPVal 是一个数组指针。

arrayPVal=&array赋值后,我们暂且记住对数组首地&后,相当于做了一个强制类型转换,把一个int *指针转化为 int (*)[ ] 指针。

他的值等于array数组第一个元素的地址的地址。*arrayPVal在值上等于 &array[0]; 不知到下面的为什么要写成这样?

    printf("array[0]=%d\n",**arrayPVal);
    printf("array[1]=%d\n",*(*arrayPVal+1));

原创粉丝点击