iOS开发之c语言基础Lesson-08 指针 上课笔记 与 试题练习

  • 时间:
  • 出处:跟我学网络
  • 作者:
  • 浏览:513

标签:

  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("\n%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("\nMax = %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:工作原理,给定一个开始地址,一个一个字符的输出,直到遇到‘\0‘ 结束。
107     //    while (*ptr) {
108     //        printf("%c", *(ptr++));
109     //    }
110     //    //strcpy(),工作原理:给定目的字符串,以及源字符串开始地址,从源字符串一个一个字符的开始拷贝到目的字符串的开始地址,直到将源字符串的 ‘\0‘ 拷贝完成结束。
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 = [email protected];
122     //            }
123     //            ptr++;
124     //        }
125     //    ptr = string;  //需要将ptr重新指向string
126     //    printf("%s\n空格个数:%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 != ‘\0‘)
10     //    {
11     //        i++;
12     //        p++;
13     //    }
14     //    printf("\n字符串的长度:%d",i);
15     //
16     //
17     //    //指针数组
18     //    char *strings[3] = {"iOS", "Android", "WP"};
19     //
20     //    for (int i = 0; i < 3; i++) {
21     //        printf("\n%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("\na = %.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\n",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 }