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("\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 = '@';
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 }