欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > 指针与一维数组

指针与一维数组

2024/10/23 23:22:22 来源:https://blog.csdn.net/m0_73777617/article/details/140948335  浏览:    关键词:指针与一维数组

目录

指针:

指针变量的初始化:

赋值:

指针作为函数参数:

//一维整型数组

指针实现一维数组逆序:

指针实现选择排序:

指针实现冒泡排序:

指针实现插入排序:

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

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


指针:

指针变量的初始化:

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

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

eg:

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

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

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

赋值:

int *p;
p = NULL;//正确,因为p和NULL都是指针类型,直接赋值即
*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);

   void printArray(int *a,int len){int i = 0;int *p = a;for(i = 0;i < len; i++){printf("a[%d] = %d\n",i,a[i]);printf("a[%d] = %d\n",i,*(a+i));printf("a[%d] = %d\n",i, *(p+i));printf("a[%d] = %d\n",i, *a++);printf("a[%d] = %d\n",i,*p++);}}

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

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

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

指针实现一维数组逆序:

  void reverse(int *begin,int *end){while(begin <= end){int temp = *begin;*begin = *end;*end = temp;begin++;end--;}}

指针实现选择排序:

  void chooseSort(int *begin,int *end){int *p = begin;int *q = NULL;for(p = begin; p < end; p++)//第一个依次和后面的相比,要走到倒数第二个{for(q = p + 1; q <= end; q++ )//要走到最后一个{if(*p > *q){int temp;temp= *p;*p = *q;*q = temp;}}}}

指针实现冒泡排序:

  void bubble(int *begin,int *end){int *p = begin;int *q = NULL;for(p = end ; p > begin;p--)//控制趟数{for(q = begin;q < p;q++)//控制比较次数{if(*(q+1) < *q){int temp = *q;*q = *(q+1);*(q+1) = temp;}}                                                                                                                                                                                                 }}

指针实现插入排序:

  void inserSort(int *begin,int *end){int *p = begin;int *q = NULL;for (p = begin+1; p <= end; p++)//第0个直接赋值,从第一个开始判断{int temp = *p;q = p;while(q > begin && *(q-1) > temp)//忌q>0{*q = *(q - 1);q--;}*q = temp;}}

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

  int* binarySort(int *begin,int *end,int n){int *mid = NULL;int *ret = NULL;while(begin <= end){mid = begin + (end-begin)/2;if(*mid > n){end = mid - 1;}else if(*mid < n){begin = mid + 1;}else{ret = mid;break;}}return ret;} int main(){int a[10] = {1,2,3,4,5,6,7,8,9,10};int len = sizeof(a)/sizeof(a[0]);int n;scanf("%d",&n);int* ret = binarySort(a,a+len-1,n);if(ret == NULL){printf("not found\n");}else{printf("found  %d\n",*ret);}return 0;
}

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

 void quickSort(int *begin,int *end){int *k = begin;int *p = begin;int *q = end;if(begin >= end){return;}while(begin < end){while(begin < end && *end >= *k)//右一半找比基准值小的{end--;}while(begin < end && *begin <=*k)//左一半找比基准值大的{begin++;}int t = *begin;//右边找到比基准值小的数,左边找到比基准值大的数,两者交换位置,重复操 //作,直到begin = end;*begin = *end;*end = t;}int temp;//交换基准值与begin,end相遇的地方的值,确定一个数正确的位置temp = *k;*k = *begin;*begin = temp;quickSort(p,end-1);//左一半递归                                                                                                                                                                       quickSort(begin+1, q);//右一半递归}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com