数组变量和指针的关系

老师说数组变量可以被看作是const的指针变量,到底是“可以被看作”,还是“就是”指针呢?

用程序证据来说明你的观点。

(提示:如果对const指针的所有的操作都可以对数组变量做,而且结果一致,就说明数组变量就是指针;如果有某个操作不能做,或者结果不一致,就说明不是指针)

    #include <stdio.h>
    int main(){
        int a[] = {1,1,2,3,4,5,6,7,8,9,0,};
        int *const p = &a[0];

        printf("sizeof(a) = %d , sizeof(p) = %d \n",sizeof(a) , sizeof(p));
            //sizeof(a)显示为44,是数组整个的一个长度,sizeof(p)显示为8; 是指针的长度 
        printf("main:p = %p\n",p);
        printf("main:a = %p\n",a);
            //在主函数中仍然是数组的首地址 
        a[13] = 10;
        printf("main:a[13] = %d\n",a[13]); 
        p[13] = 10;
        printf("main:p[13] = %d\n",p[13]);
        //在主函数中都可以顺利执行 
        sum(a , 11);
    } 

    int sum(int a[],int len){
        int sum = 0;
        int i = 0; 
        int *const p = &a[0];
    //    int *const a = &a[0]; //[Error] 'a' redeclared as different kind of symbol (a 重新声明为不同类型的符号) 
    //    int *const p = &a[0]; //[Error] redefinition of 'p'                          (p重复定义) 
        //上面两个提示的是不同的错误, 说明数组参数实际上不是常量指针这个类型
    //    int * a = &a[0];  26    //[Error] 'a' redeclared as different kind of symbol
    //    int *const p = &a[0];   //[Error] redefinition of 'p'
        //说明数组参数也不是指针 
        printf("p = %p\n",p);
        printf("a = %p\n",a);
        //他两指向的是一个数组
        p[1] = 10;
        printf("p[1] = %d\n",p[1]);
        a[1] = 10; 
        printf("a[1] = %d\n",a[1]);
        //上面无论执行哪个都是一样的,而且都可执行,这说明在修改变量,访问变量上是相同的
        a[13] = 10;
        printf("a[13] = %d\n",a[13]); 
        p[13] = 10;
        printf("p[13] = %d\n",p[13]);
        //这说明a也并没有存储关于他的长度的信息,它仅仅是一个地址,和p一样,两个都没有警告,可以编译出相同的结果



        for(i = 0;i < len;i++){
            sum += a[i];
        }
        printf("sizeof(a) = %d  \n",sizeof(a) ); 
        //通过编译看以看到sizeof(a)仍然是8,从这点看,传递的数组参数确实和常量指针一样 
        return sum;
    }
    //从上面的测试来看,当数组变量作为参数时,它不是严格意义上的指针,更不是常量指针,但是他可以被看做指针,而且常量指针的操作都可以作用于数组变量
    //当数组变量不是参数时,即它在主函数中,它有两层含义 ,在用在sizeof上时,它似乎被看做了一个数组整体,但是其他情况下,都可以被当做常量指针。 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值