• 关于数组和指针的一道例题的解读


    #include <stdio.h>
    int main(int argc, char *argv[])
    {
        int a[3]={1,2,3};
        int (*pa)[3];
    //  *pa=a; //错误,因为pa没有被赋值,怎么取值,语法错误。
        pa=&a; //正确,&a为指向数组的地址,和pa类型匹配
        printf("*pa=%p
    ",*pa); //正确,*pa含义为:对pa解引用,得到数组a的地址。
        printf("*pa+1=%p
    ",*pa+1); //正确,*pa+1:先计算*pa(相当于数组名,默认被编译器自动转换为数组>首元素首地址)得到数组首元素地址,然后加1,移动4个字节
        printf("*(pa+1)=%p
    ",*(pa+1)); //正确,*(pa+1):先计算(pa+1),因为pa为数组首地址(注意不是数组首
    元素地址)类型是整个数组,所以(pa+1)移动了整个数组的字节数,也就是12个字节。
            
        printf("&*pa=%p
    ",&*pa);//正确,由这个可以看出(*pa)被编译器看作是数组名,因为对数组名取地址得>到的指针类型是整个数组结构。
        printf("&*pa+1=%p
    ",&*pa+1);//结果是移动了12个字节,表明(&*pa)为指向数组的指针。
    //  *pa=a; //错误,因为(*pa)为数组a的地址,是一个地址直接量,不可以改变。
    //  *pa=&a;  //error
    //  *pa=&a[0]; //error
    //  *pa=*pa+1; //错误,同理(*pa)为一个地址直接量,不是左值,不能进行自加运算。
        *pa++;  //正确,自加的是pa不是(*pa),不信你可以试试:(*pa)++                                    
        printf("*pa=%p
    ",*pa);
        
        
    
        return 0;
    }
  • 相关阅读:
    反转字符串
    数组
    复杂度分析(二)
    复杂度分析(一)
    业务应该这么写--特性
    5种方法快速启动一个应用程序
    业务应该这么写--表达式树
    业务应该这么写--泛型
    业务应该这么写--异常处理
    关于关系型数据库外键,要减轻数据库压力的一些说法
  • 原文地址:https://www.cnblogs.com/litifeng/p/7868393.html
Copyright © 2020-2023  润新知