• 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

  • 相关阅读:
    你真的懂@ResponseBody和@RequestBody吗?
    Codeforces Beta Round #7 D. Palindrome Degree manacher算法+dp
    hihocoder #1032 : 最长回文子串 Manacher算法
    CSU 1808: 地铁 最短路
    UVALive 6912 Prime Switch 暴力枚举+贪心
    Codeforces Beta Round #9 (Div. 2 Only) D. How many trees? dp
    UVALive 6913 I Want That Cake 博弈+dp
    UVALive
    Codeforces Round #245 (Div. 1) B. Working out dp
    HDU 5834 Magic boy Bi Luo with his excited tree 树形dp
  • 原文地址:https://www.cnblogs.com/guoweilf/p/11550726.html
Copyright © 2020-2023  润新知