zoukankan      html  css  js  c++  java
  • C语言学习指针和数组2

    一.指针和数组的区别

    数组名是一个地址,而指针是一个左值。

    二.指针数组和数组指针

    int *p1[5]; 指针数组 //  []中的优先级高,故先定义了一个长度5的整型数组,然后数组中的每个元素都是指向int的指针。

    int (*p2)[5];数组指针 //()和[]优先级一样,结合后从左往右,故先定义了一个指向整型的p2指针,它指向有5个元素的一维数组。

     1.指针数组 (example)

    #include <stdio.h>
    
    int main()
    {
        int a = 1;
        int b = 2;
        int c = 3;
        int d = 4;
        int e = 5;
        int *p1[5] = {&a, &b, &c, &d, &e};
        int i;
    
        for (i = 0; i < 5; i++)
        {
            printf("%d
    ", *p1[i]);
        }
    
        return 0;
    }

    #include <stdio.h>
    
    int main()
    {
        char *p1[5] = {
        "让编程改变世界", 
        "just do it",
        "一切皆有可能",
        "永不止步",
        "one more thing" 
        };
        int i;
        for (i=0;i<5;i++){
            printf("%s
    ",p1[i]);
        }
        return 0;
    }

     2.数组指针(example)

    #include <stdio.h>
    
    int main()
    {
        int temp[5] = {1, 2, 3, 4, 5};
        int (*p2)[5] = &temp;
        int i;
    
        for (i = 0; i < 5; i++)
        {
            printf("%d
    ", *(*p2 + i));
        }
    
        return 0;
    }

    #include <stdio.h>
    
    int main()
    {
        int temp[5] = {1, 2, 3, 4, 5};
        int *p = temp;
        int i;
    
        for (i = 0; i < 5; i++)
        {
            printf("%d
    ", *(p + i));
        }
    
        return 0;
    }

    //#include <stdio.h>
    //
    //int main()
    //{
    //        int array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20};
    //        int *p = (int *)(&array + 1);
    //         
    //         printf("%d
    ",sizeof(array)); // 84
    //        printf("%p
    ", &array);   //--> 十进制 6487536 
    //         printf("%p
    ", (&array+1)); //--> 十进制 6487620 差了一个sizeof(array) 
    //         printf("%p
    ", (&array+2)); //-->十进制 6487704 
    //        printf("%d
    ", *(p -4));
    //
    //        return 0;
    //}
    
    #include <stdio.h>
    
    int main()
    {
            int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
            int (*p)[10] = &array;
    
            printf("%d
    ", *(*(p+1)-6));
    
            return 0;
    }

    必须清楚一个指针变量将告诉我们两个信息:某个数据结构的起始地址,以及该结构的跨度。比如 int p = &a; 说明该指针指向变量 a 的起始地址,以及它的跨度为 sizeof(int)。所以 p + 1 == p + sizeof(int)。
    int (*p)[10] 虽然是定义一个整型指针,但不要忘了它后边还有一个数组,所以它的跨度应该是 sizeof(int) * 10,而 array 作为数组名,它的含义是“指向数组第一个元素的地址”,所以 array 的跨度是 sizeof(array[0]),因此编译系统遇到 int (*p)[10] = array; 这样的定义就会果断报错:“左右类型不一致”。

     指针指向的数组+1:偏移量详解:https://www.cnblogs.com/liushui-sky/p/10025732.html

     运算符优先级引用https://fishc.com.cn/forum.php?mod=viewthread&tid=67664&extra=page%3D1%26filter%3Dtypeid%26typeid%3D571

  • 相关阅读:
    english note(6.3 to 6.8)
    english note(6.2 to 5.30)
    Lambda表达式
    Python Software Foundation
    eval(input())
    北航操作系统实验2019:Lab4-1代码实现参考
    北航操作系统实验2019:Lab4-1流程梳理
    面向对象设计与构造2019 第二单元总结博客作业
    面向对象设计与构造2019 第一单元总结博客作业
    Java代码度量分析工具:Designite简介
  • 原文地址:https://www.cnblogs.com/guoweilf/p/11550726.html
Copyright © 2011-2022 走看看