• c18---数组和指针


    //
    //  main.c
    //  day09
    
    #include <stdio.h>
    
    int main(int argc, const char * argv[]) {
        
        int num = 10;
        int *numP = &num;
        num = 55;
        *numP = 100;
        // num == *numP
        printf("%i
    ", num);//100
        printf("%i
    ", *numP);//100
        
        int ages[3] = {1, 3 , 5};
        // 数组名保存的是数组的地址, 数组的地址就是首元素的地址
        printf("ages = %p
    ", ages);//0xff4c
        printf("&ages[0] = %p
    ", &ages[0]);//0xff4c
        
        // 指针是专门用于保存地址
        // 数据类型 *变量名称;
        // 由于数组的首元素的地址就是数组的地址, 所以定义一个指针指向数组其实就是定义一个指针指向数组的首元素, 所以数组的首元素是什么类型, 那么指向数组的指针就是什么类型
        int *p = &ages[0];
        int *p = ages;// 数组名也是地址类型int*,数组的首元素是什么类型那么数组指针p就是什么类型
        printf("p = %p
    ", p);//0xff4c
        printf("&ages[0] = %p
    ", &ages[0]);//0xff4c
        
        // 如何利用指针操作数组
        int ages[3] = {1, 3 , 5};
        
        ages[0] = 998;
        printf("ages[0] = %i
    ", ages[0]);
        
        int *p = ages; // int *p = &ages[0]; &ages[0] == ages
        printf("p = %p
    ", p);////0xff4c
        printf("ages = %p
    ", ages); //0xff4c, p == ages;
        
        // 以为p指针中存储的值和ages中存储的值相同, 所以以前用ages的地方都可以使用p来替代
        p[0] = 889;
        printf("ages[0] = %i
    ", p[0]);//889
        
        for (int i = 0; i < 3; i++) {
            printf("p%i] = %i
    ", i, p[i]);//889,3,5,二位数字好像不行
        }
        
        int ages2[2][3] = {{1, 3 , 5},{2,4,6}};
        int *p2 = ages2;
        for(int i=1;i<=6;i++){
            printf("%i", p2++);//1,3,5,2,4,6,一维数组二维数组存储空间是连续的。
        }
        
        int ages[3] = {1, 3 , 5};    //ages占用12个字节,
        int *p;
        p = ages; // int *p = &ages[0];
        printf("ages[0] = %i
    ", ages[0]);//1
        printf("*p = %i
    ", *p);//1
        
        printf("p = %p
    ", p);//0xff4c
        // p = &ages[1];
        // 指针+1, 并不是真实的+1, 而是+4不是+8,
        // 指针类型的两个用途: 
           第一个用途, 取值的时候, 会根据指针类型所占用的字节去取出对应字节的数据 
           第二个用途, 用于做加法运算, 指针+1, 其实是加上指针类型所占用的长度 , 如果当前指针类型是int, 那么+1本质上是加上4个字节
        p = p + 1;
        printf("p + 1 = %p
    ", p);//0xff50
        printf("*p = %i
    ", *p);//3
        
    //    p = &ages[2];
        p =  p + 1;
        printf("p + 1 = %p
    ", p);//0xff54
        printf("*p = %i
    ", *p);//5
        
        int a = 10;
        a = a  + 1;
        printf("a = %i
    ", a);  // 11
        
        int num = 10;    //num占用4个字节
        int *numP = &num;    //numP占用8个字节
        printf("num = %i
    ", num);    //10
        // *numP 代表访问numP指向的那块内存空间
        printf("*numP = %i
    ", *numP);    //10
        
        char c = 'a';
        char *cp = &c;
        printf("cp = %p
    ", cp);//0xffab
        cp = cp + 1;
        printf("cp + 1 = %p
    ", cp);//0xffac
        cp = cp + 1;
        printf("cp + 1 = %p
    ", cp);//0xffad,字符只占用一个字节
        
        
        int ages[3] = {1, 3 , 5};
        int *p;
        p = ages;
        
        printf("ages[0] = %i
    ", *(p + 0));    //1
        printf("ages[1] = %i
    ", *(p + 1)); //3, p = p + 1; *p;
        printf("ages[2] = %i
    ", *(p + 2));    //5
         
        for (int i = 0; i < 3; i++) {
            // 指针+1, 是加上指针类型所占用的长度
            printf("ages[%i] = %i
    ", i, *(p + i));    //1,3,5
        }
        
        
        /*
         只要一个指针指向了数组, 那么访问数组就有3种方式:
         1. : ages[0];
         2. : p[0];
         3. : *(p + 0);
         */
        
        printf("ages[0] = %i
    ", 2[p]);//5
        return 0;
    }
  • 相关阅读:
    HTML5是否已为实际应用做好准备? 狼人:
    10月Web服务器调查:Apache下降 Ngnix攀升 狼人:
    微软IE9通过97.7%的CSS 2.1测试 狼人:
    PHP将死。何以为继? 狼人:
    Firefox 4.0 Beta 8开始开发 新引擎依然没影 狼人:
    Adobe发布Air 2.5支持RIM平板电脑 狼人:
    Firefox 4.0:我们2011年再见面吧 狼人:
    Adobe AIR登陆Android 狼人:
    Google不推荐在URL里使用竖线 狼人:
    40个很不错的CSS技术 狼人:
  • 原文地址:https://www.cnblogs.com/yaowen/p/7389730.html
Copyright © 2020-2023  润新知