首页 > 其他分享 >指针与一维数组

指针与一维数组

时间:2024-08-09 23:28:08浏览次数:7  
标签:begin end 一维 int 数组 NULL 指针

目录

指针:

指针变量的初始化:

赋值:

指针作为函数参数:

//一维整型数组

指针实现一维数组逆序:

指针实现选择排序:

指针实现冒泡排序:

指针实现插入排序:

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

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


指针:

指针变量的初始化:

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

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

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);//右一半递归
 }

标签:begin,end,一维,int,数组,NULL,指针
From: https://blog.csdn.net/m0_73777617/article/details/140948335

相关文章

  • 指针进阶--指针与一维字符型数组
    目录const关键字:constinta =10;constint*p=&a;(等价于intconst*p=&a)const的应用:一维字符型数组与字符函数指针实现strcpy的功能:指针实现strncpy的功能:指针实现strcat功能:指针实现strncat功能:指针实现strcmp功能:指针实现strncmp功能:void*指针(万能指针):指......
  • 深入了解指针(5)
    1.数组指针变量2.⼆维数组传参的本质3.函数指针变量2.⼆维数组传参的本质3.函数指针变量)1.数组指针变量1.1了解数组指针变量的概念整形指针变量——变量——存放的是整形的地址字符指针变量——变量——存放的是字符的地址数组指针——变量—......
  • 超简单适合练手的双指针题:判断子序列
    给定字符串 s 和 t ,判断 s 是否为 t 的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。示例1:输入:s="abc",t="ahbgdc"输出:true示例2:输入:s="axc......
  • Arrays数组做操作工具类
    packagecom.shujia.day12;importjava.util.Arrays;/*Arrays:是java提供专门针对数组做操作的工具类,该类没有构造方法,且方法都是静态的成员方法:publicstaticStringtoString(int[]a)将任意一个数组中的所有元素以字符串的形式拼接返回......
  • Python和AI库NumPy(三):数组形状与变换
    目录1.数组的基础形状操作1.1查看数组的形状1.2改变数组的形状2.数组的转置与轴交换2.1数组的转置2.2交换数组的轴3.数组的合并与分割3.1数组的水平与垂直合并3.2数组的分割4.高级数组变换技巧4.1广播机制(Broadcasting)4.2使用expand_dims()和squeeze()......
  • Java中数组算法的学习
    数组的算法目录数组的算法概述冒泡排序选择排序排序算法库StreamAPI概述简单排序:冒泡排序、选择排序、插入排序高级排序:快速排序、归并排序、希尔排序相关算法知识:划分、递归、二分查找冒泡排序原理:从第一个数据开始,与第二个数据相比较,如果第二个数据小于第一个数据,......
  • react函数组件实现调用摄像头拍摄功能
    importReact,{useEffect,useRef,useState}from'react'exportdefaultfunctionPaiZhao(){  constcameraVideoRef=useRef(null);  constcameraCanvasRef=useRef(null);  const[Img,setImg]=useState("")  useEffect((......
  • C语言---指针的运算和各种类型的指针
    指针的运算1.指针+1或者指针-1是什么意思?把指针中记录的内存地址,往后或者往前移动一个步长2.什么是步长?跟什么有关?跟数据类型有关Windows64位操作系统:char:移动一个字节short:移动两个字节int:移动四个字节long:移动四个字节longlong:移动八个字节有意义的操作......
  • 数组
    数组概念数组的相关概念和名词1、数组(array)数组(array):简单的说,就是一组数,一组具有相同数据类型的数,是按照一定顺序排列的集合。当一组数据的数据类型,意义是一样的时候,那么为了方便的统一的管理它们,我们需要用新的数据的存储结构来进行存储。例如:数组。所谓数组(Array),就......
  • 3224. 使差值相等的最少数组改动次数
    原题链接前情提要,结合原题解区的题解题解先简化问题,对于一对数\(a,b\),其中\(a\leqb\),要使其差为\(X\)的操作数是多少?分类讨论1.如果\(b-a==X\),操作数为\(0\)(不操作)2.如果\(X\ltb-a\),操作数为\(1\)(增加a或者减小b)3.如果\(X\in[b-a+1,k-a]\),操作数为\(1\)(增大b......