【学习ios之路:C语言】指针
指针
1.指针定义,即简单用法.
<span style="font-size:14px;"> //指针变量:专门用来存储地址的变量. int *p = NULL;//NULL == 0 /** * 变量定义时: * (int *):指针类型 * p: 变量名 NULL:初始值. * NULL(指向了一个无效的区域) * *的作用: 告诉编译器,后面变量是指针变量,用来存储地址. * int作用: 1.当通过指针变量取数据时,一次性读取几个字节的数据. 2.当指针变量+1时,一次性增加几个字节. * 指针变量的空间大小和操作系统有关,32为4个字节,64位8个字节. */ int a = 10; p = &a; //p存储a的地址 指针p指向a //间接访问,找到变量的地址. printf("%d\n",*p);//此时*的作用:根据p中的地址,找到对应的地址的空间.如果*p在等号的左边,则是赋值操作,</span><pre name="code" class="cpp"><span style="font-size:14px;"> 否则是取值操作.</span>*p = 20;//将20赋值给指针p所指向的存储空间.即修改p指向的内存空间的数据.
2.1指针的简单练习
<span style="font-size:14px;">//用指针操作交换a,b的值</span><span style="font-size:14px;"> int a = 10 , b = 5; int *p1 = &a;//指向a,指针变量,用来存储地址. int *p2 = &b;//指向b //通过指针变量交换a,b的值 int temp = 0; temp = *p1; *p1 = *p2; *p2 = temp; printf("a = %d, b = %d \n",a, b); //通过P2访问a.</span><span style="font-size:14px;">当指针变量+1时,一次性增加几个字节.</span><span style="font-size:14px;"> printf("a = %d \n",*(p2 + 1)); //通过p1访问b;</span><span style="font-size:14px;">当指针变量-1时,一次性减少几个字节.</span><span style="font-size:14px;">根据地址. printf("b = %d ",*(p1 - 1));</span> /* <span style="font-size:14px;"> //这样只交换了指针指向的地址,而a,b的值没变. //通过指针变量交换a,b的值 int *temp = p1; p1 = p2; p2 = temp;</span> */
2.2通过指针地址获取元素
int a = 10, b = 20, c = 30; int *p = &b;//指针指向b的地址 printf("b = %d\n", *p); printf("a = %d\n", *(p + 1));//通过地址获取到a //访问到a printf("a = %d\n", a); printf("a = %d\n", *(&a));//通过a的地址 printf("a = %d\n", *(p + 1));//当指针变量+1时,一次性增加几个字节. printf("a = %d\n", *(&b + 1)); printf("a = %d\n", *(&c + 2)); p = &c;//指针变量重新赋值的过程就叫做指针重定向.
2.3 指针对数组的应用
int a[5] = {1, 2, 3, 4, 5}; int *p = a; //存储数组的首地址,a本身是地址,所以不用取地址符 printf("%d\n",*p); printf("%d\n",*(p + 2));//a[2] 或者 p[2] printf("%d\n", 3[a]);// 3[a] *(3 + a) 相当于 a[3] ---- *(a + 3) .. * (p + 3) printf("%d\n", 4[a]); //遍历输出元素 for (int i = 0; i < 5; i++) { printf("%d ", *(p + i));//p[i] } printf("\n"); for (int i = 4; i >= 0 ; i--) { printf("%d ", *(p + i)); }
2.4通过指针,进行数组的冒泡排序.
int b[10] = {0}; int *p = b; //通过指针操作 //赋值20 -40 for (int i = 0; i < 10; i++) { *(p + i) = arc4random() % (40 - 20 + 1) + 20; printf("%d ", *(p + i)); } //升序 for (int i = 0; i < 10 - 1; i++) { for (int j = 0; j < 10 - 1 - i; j++) { if (*(p + j) > * (p + j + 1)) { int temp = 0; temp = *(p + j); *(p + j) = *(p + j + 1); *(p + j + 1) = temp; } } } printf("\n"); //输出 for (int i = 0; i < 10; i++) { printf("%d ", *(p + i)); }
2.5运用指针,求出数组中的最大值,最小值.第二大值.和的操作.
int m[10] = {0}; int *p = m; //赋值10 - 50 for (int i = 0; i < 10; i++) { *(p + i) = arc4random() % (50 - 10 + 1) + 10; printf("%d ", *(p + i)); } printf("\n"); //求所有元素的最大值 int max = 0; for (int i = 0; i < 10; i++) { if (*(p + i) > max) { max = *(p + i); } } printf("最大值为:%d\n", max); //求所有元素的最小值 int min = 0; for (int i = 0; i < 10; i++) { if (i == 0) { min = *(p + i); } else if (min > *(p + i)){ min = *(p + i); } } printf("最小值为:%d\n", min); //求所有元素的第二大值 int sexMax = 0; for (int i = 0; i < 10; i++) { if (max < *(p + i)) { sexMax = max; max = *(p + i); } else if(*(p + i) > sexMax && *(p + i) != max) { sexMax = *(p + i); } } printf("第二大值为:%d\n", sexMax); //求所有元素的和 int sum = 0; for (int i = 0; i < 10; i++) { sum += *(p + i); } printf("sum = %d\n", sum);
2.6 数组和指针变量的比较.
<span style="font-size:14px;"> /** * 比较 数组 和指针变量 * 1.空间大小 * 数组所占存储空间 = 数组元素个数 * 单个元素所占存储空间的大小. * 指针变量所占存储空间大小和操作系统位数有关,32位操作系统4个字节,64位操作系统8个字节. * 2.可变性 * 数组名代表数组的首地址,是一个常量地址,不可改变. * 指针变量本质上就是一个变量,可以重新赋值,指针赋值的过程叫做指针重定向. */</span>
2.7指针变量和字符数组(字符串)
char str[] = {"ac is big company , yao shang shi"}; char *p = str; printf("%c\n", *(p+6)); //%s的工作原理:给定一个开始地址,一个字符一个字符的输出,知道遇到\0结束. printf("%s\n", p);// printf("%s", str); printf("%s\n", p + 23);//yao shang shi *(p + 5) = '\0'; printf("%s\n", p); *(p + 20) = '\0'; printf("%s\n", p + 13); //1.字符串长度 //strlen的工作原理:给定一个开始地址,一个字符一个字符的输出,知道遇到\0结束 unsigned long length = strlen(p + 22);//p相当于str printf("%ld \n", length); //2.字符串拷贝 //strcpy的工作原理:给定一个开始地址,一个字符一个字符的输出,知道遇到\0结束 //strcpy 返回目的字符串的地址. printf("%s\n",strcpy(p + 5,"Frank"));//Frank strcpy(p + 5,"Frank"); printf("%s\n",p);//LanouFrank //3.字符串比较(从首字母比较,首字母相等,比较下一个.) printf("%d\n", strcmp(p, "bb"));//-1 printf("%d\n", strcmp(p + 1, "bb"));//12.8指针字符串应用
//求字符串中个空格的个数,有指针操作 char str[] = "I LOVE IOS"; char *p = str; int i = 0; int num = 0; while (*(p + i) != '\0') { if (*(p + i) == ' ') { num++; } i++; } printf("%d", num); //方法2 char str[] = "I L O V E I O S"; char *p = str; int num = 0; while (*p) { if (*p == ' ') { num++; } p++;//地址++ } printf("%d", num);
2.9基本概念
//1.指向要有明确的指向,即有效的区域.2.要指向一个可控的区域. //char *p = NULL;//null,即让指针p指向一个无效的地址.//address = 0x0,即指向一个无效的区域 //char *p = 0xfffff01; //strcpy(p, "aaa"); //指针数组,常量区,值不能修改, char *str[] = {"xiaozhang", "xiaoqiang", "xiaoli"};//地址 char *p1 = "Frank";// *p1指向的是常量字符串的首地址.P1是指针变量,存储的是地址. // *P1指向的是常量字符串的首地址,处在常量区,常量区的内容不可以更改,即只能读,不能写. strcpy(p1, "DUCK");3.0对指针数组进行排序.
//指针数组,常量区,值不能修改, char *str[] = {"xiaozhang", "xiaoqiang", "xiaoli"};//地址 printf("%s", str[1]);//xiaoqiang printf("%s", str[0]);//xiaozhang%s的工作原理:给定一个开始地址,一个字符一个字符的输出,知道遇到\0结束 //strcpy(str[0], "lanou"); //升序排列 printf("\n"); printf("%c", *str[2]);//取到一个字符 for (int i = 0; i < 3 - 1; i++) { for (int j = 0; j < 3 - 1 - i ; j++) { if (strcmp(str[j], str[j + 1]) > 0) { char *temp = str[j]; //将地址赋值给指针变量. str[j] = str[j + 1]; //交换的是地址. str[j + 1] = temp; } } } for (int i = 0; i < 3; i++) { printf("%s ", str[i]); }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。