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 }