• 学点 C 语言(21): 数据类型 数组与指针



    1. 获取数组的地址无须 &, 因为数组名本身就是个地址
    #include <stdio.h>
    
    int main(void)
    {
        char c = 'A';
        char cs[] = "ABC";
    
        printf("%c, %s\n", c, cs);           /* 获取字符及字符数组的内容 */
        printf("%p, %p, %p\n", &c, cs, &cs); /* 获取字符及字符数组的地址, cs 与 &cs 没有区别*/
    
        getchar();
        return 0;
    }
    

    2. 数组元素的地址是连续的:
    #include <stdio.h>
    
    int main(void)
    {
        char cs[] = "ABC";
    
        printf("%p\n%p\n%p\n%p\n", cs, &cs[0], &cs[1], &cs[2]);
    
        getchar();
        return 0;
    }
    

    3. 数组名所代表的地址就是第一个元素的地址:
    #include <stdio.h>
    
    int main(void)
    {
        char str[] = "ABC";
        char *p1 = str;
        char *p2 = &str[0];
    
        printf("%p, %p\n", p1, p2);
    
        getchar();
        return 0;
    }
    

    4. 通过指针访问数组元素:
    #include <stdio.h>
    
    int main(void)
    {
        char str[] = "ABC";
        char *p = str;
    
        printf("%c\n", *p);
        printf("%c\n", *p+1);
        printf("%c\n", *p+2);
    
        printf("\n");
        
        printf("%c\n", *p);
        printf("%c\n", *++p);
        printf("%c\n", *++p);
    
        getchar();
        return 0;
    }
    

    5. 通过指针遍历数组:
    #include <stdio.h>
    
    int main(void)
    {
        char str[] = "123456789";
        char *p = str;
    
        int i;
        for (i = 0; i < sizeof str/sizeof str[0]; i++) {
            printf("%c\n", *p);
            p++;
        }
    
        getchar();
        return 0;
    }
    
    #include <stdio.h>
    
    int main(void)
    {
        char str[] = "123456789";
        char *p = str;
    
        while (*p != '\0') {
            printf("%c\n", *p);
            p++;
        }
    
        getchar();
        return 0;
    }
    
    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
        char str[] = "123456789";
        char *p = str;
    
        int i;
        for (i = 0; i < strlen(str); i++) {
            printf("%c\n", *(p+i));
        }
    
        getchar();
        return 0;
    }
    
    #include <stdio.h>
    
    int main(void)
    {
        int nums[] = {111,222,333,444};
        int *p = nums;
    
        int i;
        for (i = 0; i < sizeof nums / sizeof nums[0]; i++) {
            printf("%d\n", *p++);
        }
    
        getchar();
        return 0;
    }
    

    6. 注意: 指针+1 是根据元素大小移动一个位置
    #include <stdio.h>
    
    int main(void)
    {
        int nums[] = {111,222,333,444};
        int *p = nums;
    
        int i;
        printf("%d\n", *p);
        printf("%d\n", *(p+1));
    
        printf("%d\n", *p+1);  /* 不是这样; 这是代表取值后再 + 1 */
        
        getchar();
        return 0;
    }
    

    7. 上面的指针其实都是数组元素的指针, 如何声明真正的数组指针呢?
    #include <stdio.h>
    
    int main(void)
    {
        int nums[4] = {111,222,333,444};
        int (*p)[4] = &nums;      /* 注意其中的小括号 */
    
        printf("%d\n", (*p)[1]);  /* 用起来并不方便   */
        printf("%d\n", (*p)[2]);
        
        getchar();
        return 0;
    }
    

  • 相关阅读:
    2020/2/14
    2020/2/13
    《人类简史》
    2020/2/12
    bzoj3157国王奇遇记(秦九韶算法+矩乘)&&bzoj233AC达成
    [noip科普]关于LIS和一类可以用树状数组优化的DP
    [uva11722&&cogs1488]和朋友会面Joining with Friend
    Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)
    NOIP2016滚粗记
    bzoj2228[ZJOI2011]礼物(gift)
  • 原文地址:https://www.cnblogs.com/del/p/1342667.html
Copyright © 2020-2023  润新知