当前位置:   article > 正文

指针与一维数组

指针与一维数组

目录

指针:

指针变量的初始化:

赋值:

指针作为函数参数:

//一维整型数组

指针实现一维数组逆序:

指针实现选择排序:

指针实现冒泡排序:

指针实现插入排序:

指针实现一维整型数组二分查找(有序数组前提下):

指针实现一维数组快速排序:


指针:

指针变量的初始化:

如果指针没有初始化,此时是随机值----野指针

此时分配到的地址是随机值,访问到不能访问的地址,会报段错误

eg:

  1. 1 #include <stdio.h>
  2. 2
  3. 3 int main()
  4. 4 {
  5. 5 int *p;
  6. 6
  7. 7 printf("%p",p);
  8. 8 printf("%d",*p);
  9. 9
  10. 10 return 0;
  11. 11 }
  1. Segmentation fault (core dumped)

因此,我们要对指针进行初始化,让指针有明确的指向:可以指向空指针(不能修改里面的东西)

  1. int a = 18;
  2. int *p = &a;||int *p = NULL;
  1. int *p,q;//p是指针类型,q是int型
  2. int *p,*q;//此时定义了两个int*类型的变量p,q;
  3. //定义的时候*修饰变量名的,表示定义的是指针类型的变量

赋值:

  1. int *p;
  2. p = NULL;//正确,因为p和NULL都是指针类型,直接赋值即
  3. *p = NULL;//错误

指针作为函数参数

形参:指针类型的变量,用来接收实参(实参是要操作的内存空间的地址)

实参:要修改谁,就把谁的地址传过去

值传递:只是实参数据赋值给了形参

地址传递:可以实现被调函数修改主调函数的值

指针加一维数组:

int a[5]:

//一维整型数组

//类型:数组类型int [5]

//值:数组首元素地址--- 常量

数组名a是个常量,即数组首地址,不能改变,所以a不能做自增自减运算a++(x);

谁能代表数组所在空间的首地址?

数组名--即数组首地址元素 a等价&a[0] 

a[0]的数据类型 --int型

&a[0]的数据类型---int*类型

如何定义指针指向数组?pp

int *p =a;(等价于int *p = &a[0]);

指针的运算:

int a[5] = {1,2,3,4,5};

int *p = a;

p+n(表示跳过了n个基类型)

*(p+n)==a[i]==*(a+i);

  1. void printArray(int *a,int len)
  2. {
  3. int i = 0;
  4. int *p = a;
  5. for(i = 0;i < len; i++)
  6. {
  7. printf("a[%d] = %d\n",i,a[i]);
  8. printf("a[%d] = %d\n",i,*(a+i));
  9. printf("a[%d] = %d\n",i, *(p+i));
  10. printf("a[%d] = %d\n",i, *a++);
  11. printf("a[%d] = %d\n",i,*p++);
  12. }
  13. }

指针比较:>  >= < <= == !=

指针只能做减法(p-q)

指针之间加法乘法除法都是无效操作

指针实现一维数组逆序:

  1. void reverse(int *begin,int *end)
  2. {
  3. while(begin <= end)
  4. {
  5. int temp = *begin;
  6. *begin = *end;
  7. *end = temp;
  8. begin++;
  9. end--;
  10. }
  11. }

指针实现选择排序:

  1. void chooseSort(int *begin,int *end)
  2. {
  3. int *p = begin;
  4. int *q = NULL;
  5. for(p = begin; p < end; p++)//第一个依次和后面的相比,要走到倒数第二个
  6. {
  7. for(q = p + 1; q <= end; q++ )//要走到最后一个
  8. {
  9. if(*p > *q)
  10. {
  11. int temp;
  12. temp= *p;
  13. *p = *q;
  14. *q = temp;
  15. }
  16. }
  17. }
  18. }

指针实现冒泡排序:

  1. void bubble(int *begin,int *end)
  2. {
  3. int *p = begin;
  4. int *q = NULL;
  5. for(p = end ; p > begin;p--)//控制趟数
  6. {
  7. for(q = begin;q < p;q++)//控制比较次数
  8. {
  9. if(*(q+1) < *q)
  10. {
  11. int temp = *q;
  12. *q = *(q+1);
  13. *(q+1) = temp;
  14. }
  15. }
  16. }
  17. }

指针实现插入排序:

  1. void inserSort(int *begin,int *end)
  2. {
  3. int *p = begin;
  4. int *q = NULL;
  5. for (p = begin+1; p <= end; p++)//第0个直接赋值,从第一个开始判断
  6. {
  7. int temp = *p;
  8. q = p;
  9. while(q > begin && *(q-1) > temp)//忌q>0
  10. {
  11. *q = *(q - 1);
  12. q--;
  13. }
  14. *q = temp;
  15. }
  16. }

指针实现一维整型数组二分查找(有序数组前提下):

  1. int* binarySort(int *begin,int *end,int n)
  2. {
  3. int *mid = NULL;
  4. int *ret = NULL;
  5. while(begin <= end)
  6. {
  7. mid = begin + (end-begin)/2;
  8. if(*mid > n)
  9. {
  10. end = mid - 1;
  11. }
  12. else if(*mid < n)
  13. {
  14. begin = mid + 1;
  15. }
  16. else
  17. {
  18. ret = mid;
  19. break;
  20. }
  21. }
  22. return ret;
  23. }
  24. int main()
  25. {
  26. int a[10] = {1,2,3,4,5,6,7,8,9,10};
  27. int len = sizeof(a)/sizeof(a[0]);
  28. int n;
  29. scanf("%d",&n);
  30. int* ret = binarySort(a,a+len-1,n);
  31. if(ret == NULL)
  32. {
  33. printf("not found\n");
  34. }
  35. else
  36. {
  37. printf("found %d\n",*ret);
  38. }
  39. return 0
  40. }

指针实现一维数组快速排序:

  1. void quickSort(int *begin,int *end)
  2. {
  3. int *k = begin;
  4. int *p = begin;
  5. int *q = end;
  6. if(begin >= end)
  7. {
  8. return;
  9. }
  10. while(begin < end)
  11. {
  12. while(begin < end && *end >= *k)//右一半找比基准值小的
  13. {
  14. end--;
  15. }
  16. while(begin < end && *begin <=*k)//左一半找比基准值大的
  17. {
  18. begin++;
  19. }
  20. int t = *begin;//右边找到比基准值小的数,左边找到比基准值大的数,两者交换位置,重复操
  21. //作,直到begin = end;
  22. *begin = *end;
  23. *end = t;
  24. }
  25. int temp;//交换基准值与begin,end相遇的地方的值,确定一个数正确的位置
  26. temp = *k;
  27. *k = *begin;
  28. *begin = temp;
  29. quickSort(p,end-1);//左一半递归
  30. quickSort(begin+1, q);//右一半递归
  31. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/968340
推荐阅读
相关标签
  

闽ICP备14008679号