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 }

 

你可能感兴趣的:(ios开发)