zoukankan      html  css  js  c++  java
  • iOS开发之c语言基础Lesson-08 指针 上课笔记 与 试题练习

      1 ////////////////Lesson 08 指针 课堂笔记 与练习/////////////
      2     
      3     //指针:本质是一个指针变量,只不过该变量用来存储地址。
      4     //地址:内存单元的编号,也是一个数,只不过是以0x开头的十六进制数。
      5     
      6     //    int a = 10;
      7     //    int *p = &a; //定义一个指针变量,将a的地址给指针变量p;p指向a
      8     //    a = 20; //直接访问
      9     //    printf("%d ", *p);
     10     //    *p = 30; //间接访问
     11     //    printf("%d ", a);
     12     
     13     //一、int *, 指针变量的类型。
     14     //指针类型锁规定存储空间的大小和操作系统的位数有关, 32位 4个字节,64位 8个字节。所有类型指针变量的存储空间大小都是一样的。
     15     //int,作用:1.当通过指针变量存取数据时,一次存取多少个字节的数据。
     16     //           2.当指针变量自增时,一次增加多少个字节
     17     //int *p = NULL;定义时 *,作用:告诉编译器,后面的变量是一个指针变量,用来存储地址。
     18     //*p = 30;      使用时 *,作用:根据指针变量p中的存储的地址,找到指向的内存空间,进行存取数据操作。
     19     //*p放到=号左边是赋值操作,除此之外是取值操作。
     20     //二、p,指针变量的名字。
     21     //三、p = NULL, 指针变量初值,让指针指向一个无效的空间。
     22     //四、数据的访问方式:1.直接访问 ,直接通过变量名访问; 2. 间接访问,通过指针访问指向的内存空间。
     23     
     24     //////////////////////////练习//////////////////////////////////
     25     //    int a = 30, b = 50, c = 70;
     26     //    int *p = &b;
     27     //    printf("a = %d ", a);
     28     //    printf("a = %d ", *(&b + 1));
     29     //    printf("a = %d ", *(&c + 2));
     30     //    printf("a = %d ", *(p + 1));//p + 1加一个单位,意味着加 4 个字节,又a的地址比 b 的地址高出 4 个字节,所有 p + 1 获取到 a 的地址,通过 * 获取a的内容
     31     //
     32     //    printf("a = %d ", *(&*(p - 1) + 2));
     33     //    p = &c; //指针重新赋值的过程,叫做指针重指向。
     34     
     35     ////////////////
     36     //    //数组和指针的关系
     37     //    int arr[5] = {1, 3, 5, 34, 7};
     38     //    //数组名代表数组首地址,就是数组中第一个元素的地址
     39     //    int *ptr = arr;//等价于 &a[0];
     40     //
     41     //    for (int i = 0; i < 5; i++) {
     42     //        printf("%d ", *(ptr + i));
     43     //    }
     44     //    //访问数组中的第二个元素
     45     //    printf("
    %d, %d, %d, %d, %d, %d ", arr[1], *(ptr+1), *(&arr[0] + 1), *(&arr[2] - 1), *(arr + 1), ptr[1]);
     46     //    printf("1[arr] = %d ", 1[arr]);// 1[arr] == *(1 + arr), arr[1] == *(arr + 1)
     47     //
     48     //    //小结:如何访问数组a中下标为i元素?
     49     //    //a[i], i[a], p[i], i[p], *(p + i) ,*(a + i)
     50     //
     51     //    int arr[10] = {0};
     52     //    int *ptr = arr;
     53     //
     54     //    for (int i = 0; i < 10; i++) {
     55     //        *(ptr + i) = arc4random() % (40 - 20 + 1) + 20;
     56     //        printf(" %d ",  *(ptr + i));
     57     //    }
     58     //    for (int i = 0; i < 10 - 1; i++) {
     59     //        for ( int j = 0; j < 10 - 1 - i; j++) {
     60     //            if (*(ptr + j) > *(ptr + j + 1)) {
     61     //                int temp = *(ptr + j);
     62     //               *(ptr + j) = *(ptr + j + 1);
     63     //                *(ptr + j + 1)= temp;
     64     //            }
     65     //        }
     66     //    }
     67     //    for (int i = 0; i < 10; i++) {
     68     //        printf(" %d ", ptr[i]);
     69     //    }
     70     
     71     //    int array[20] = {0};
     72     //    int *p = array;
     73     //    int max = 0;
     74     //    int min = 30;
     75     //    int secondMax = 0;
     76     //
     77     //    for (int i = 0; i < 20; i++) {
     78     //        *(p + i) = arc4random() % (30 - 15 + 1) + 15;
     79     //        printf("%d ",*(p + i));
     80     //
     81     //        if (*(p + i) > max) {
     82     //            secondMax = max;
     83     //            max = *(p + i);
     84     //        }else if(*(p + i) < max && secondMax < *(p + i)){
     85     //            secondMax = *(p + i);
     86     //        }
     87     //
     88     //        min = *(p + i) < min ? *(p + i) : min;
     89     //
     90     //    }
     91     //    printf("
    Max = %d, secondMax = %d, Min = %d ", max , secondMax, min);
     92     
     93     
     94     
     95     //    short sarr[5] = {257,2,3,4,5};
     96     //    short *cp = sarr;
     97     //    printf("%d", *(cp));
     98     //
     99     //////小结:指针变量的类型,要和它指向的数据的类型一致。
    100     
    101     
    102     ////////////指针和字符串(一维字符数组)的关系
    103     
    104     //    char string[] = "I am Here, There is Lanou iOS!";
    105     //    char *ptr = string;
    106     //    //printf("%s ", ptr); //%s:工作原理,给定一个开始地址,一个一个字符的输出,直到遇到'' 结束。
    107     //    while (*ptr) {
    108     //        printf("%c", *(ptr++));
    109     //    }
    110     //    //strcpy(),工作原理:给定目的字符串,以及源字符串开始地址,从源字符串一个一个字符的开始拷贝到目的字符串的开始地址,直到将源字符串的 '' 拷贝完成结束。
    111     //    
    112 
    113     
    114     //求空格个数,并将空格替换成@
    115     //    char string[] = "I am Here, There is Lanou iOS!";
    116     //    char *ptr = string;
    117     //    int num = 0;
    118     //        while (*ptr) {
    119     //            if (*ptr == ' ') {
    120     //                num++;
    121     //                *ptr = '@';
    122     //            }
    123     //            ptr++;
    124     //        }
    125     //    ptr = string;  //需要将ptr重新指向string
    126     //    printf("%s
    空格个数:%d", ptr, num);
    127     
    128     
    129     ////////小结
    130     //数组和指针的区别:
    131     ///////////
    132     //1.所占的存储空间大小:
    133     //   数组,数组空间大小 = 数组元素个数 * 每个元素的存储空间大小
    134     //   指针变量:空间大小只和操作系统的位数有关系,32位 4 个字节, 64位 8 个字节。
    135     //2.可修改性:
    136     //   数组:数组名代表数组的首地址,地址是常量地址,不可修改。
    137     //   指针:本质是一个变量,值可以被修改,指针重新赋值的过程,叫做指针重指向。
    138 
    139     //////常量和变量的区别://///
    140     //    ptr2指向常量去的字符串,常量去的内容不能更改
    141     //    ptr1指向栈区的字符数组,数组是可变的,可以修改数组的内容。
    142     
    143     //    char str[] = "iPhone"; //将常量区的字符串拷贝到栈区(字符数组str)中
    144     //    char *ptr1 = str;
    145     //    char *ptr2 = "iPhone"; //ptr2存储常量字符串iPhone首地址。只提供地址,不拷贝字符串,
    146     //    strcpy(ptr1, "Android");
    147     //
    148     //    printf("%s ", ptr1);
    149     
    150     ////////指针数组/////////
    151     //数组中的每一个元素,都是指针变量,用来存储地址。
    152     
    153     //    char *strings[3] = {"iPhone", "Android", "Blackbarry"};
    154     //    //
    155     //    for (int i = 0; i < 3 - 1; i++) {
    156     //        for (int j = 0; j < 3 - 1 - i; j++) {
    157     //            if(strcmp(strings[j], strings[j + 1]) > 0){
    158     //                char *temp = strings[j];
    159     //                strings[j] = strings[j + 1];
    160     //                strings[j + 1] = temp;
    161     //            }
    162     //        }
    163     //    }
    164     //    for (int i = 0; i < 3; i++) {
    165     //        printf("%s ", strings[i]);
    166     //    }
    167     

    课后作业

     1  //*****************Lesson-08  指针  练习************
     2     
     3     //    char string[] = "iPhone"; //string为数组名
     4     //    char *p = string;   //指向字符数组⾸首地址
     5     //    *(p + 1) = 'v'; //操作单个字符
     6     //    printf("%s", p);    //操作整个字符串
     7     //
     8     //    int i = 0;
     9     //    while(*p != '')
    10     //    {
    11     //        i++;
    12     //        p++;
    13     //    }
    14     //    printf("
    字符串的长度:%d",i);
    15     //
    16     //
    17     //    //指针数组
    18     //    char *strings[3] = {"iOS", "Android", "WP"};
    19     //
    20     //    for (int i = 0; i < 3; i++) {
    21     //        printf("
    %s",strings[i]);
    22     //    }
    23     //
    24     //*****************Lesson-08  指针  作业************
    25     //    1.(**)编写一个函数,交换 2 个浮点数.
    26     //    float a = 5.67;
    27     //    float b = 7.89;
    28     //    float *p1;
    29     //    float *p2;
    30     //    p1 = &a;
    31     //    p2 = &b;
    32     //    swap(p1, p2);
    33     //
    34     //    printf("
    a = %.2f,b = %.2f", a, b);
    35     
    36     
    37     //    2.(***)在主函数中输入 6 个字符串(二维数组),对他们按从小到大的顺序排序,然后输出这 6 个已经排好序的字符串。要求使用指针数组进行处理。
    38     char *strings[6] = {"how", "love", "are", "ying", "wewew", "ashen"};
    39     char *temp;
    40     for (int i = 0; i < 5; i++) {
    41         for (int j = i + 1; j < 6; j++) {
    42             
    43             if(strcmp(strings[i], strings[j]) > 0)
    44             {
    45                 temp = strings[i];
    46                 strings[i] = strings[j];
    47                 strings[j] = temp;
    48             }
    49         }
    50     }
    51     for (int i = 0; i < 6; i++) {
    52         printf("%s
    ",strings[i]);
    53     }
    54     
    55     return 0;
    56 }
    57 void swap(float *p1, float *p2)
    58 {
    59     float temp = *p1;
    60     *p1 = *p2;
    61     *p2 = temp;
    62 }
  • 相关阅读:
    Linux下的lds链接脚本简介
    Fedora下载地址
    SkyEye的使用
    shell变量详解
    Linux shell 脚本攻略之正则表达式入门
    Linux shell 脚本攻略之统计文件的行数、单词数和字符数
    Linux shell 脚本攻略之创建不可修改文件
    Linux shell 脚本攻略之生成任意大小的文件
    Linux shell 脚本攻略之批量重命名
    Linux shell 脚本攻略之文件查找与文件列表
  • 原文地址:https://www.cnblogs.com/zhaoashen/p/4373049.html
Copyright © 2011-2022 走看看