指针与一维数组

发布于:2024-08-10 ⋅ 阅读:(71) ⋅ 点赞:(0)

目录

指针:

指针变量的初始化:

赋值:

指针作为函数参数:

//一维整型数组

指针实现一维数组逆序:

指针实现选择排序:

指针实现冒泡排序:

指针实现插入排序:

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

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


指针:

指针变量的初始化:

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

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

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


网站公告

今日签到

点亮在社区的每一天
去签到