当前位置:   article > 正文

指针+一维整型数组的基本运用 和 指针+一维整型数组的初步学习_用指针数组来处理一个一维数组

用指针数组来处理一个一维数组

一,调式程序的技巧:

1.明确问题
2.定位问题
3.加打印(打印核心数据0)


二,指针的回顾

1.指针的概念:指针就是地址(内存单元的编号),是一个数据类型(指针类型
                         指针在不同于句中: 定义指指针指的是定义一个指针变量(int *p)
                                                           打印指针某个变量的指针,就是打印出一个地址的内容

2.指针变量的定义: 基类型*变量名
基类型:数据类型 / 基本数据类型 / 数组类型 / 指针类型
* : *定义的是一个指针类型的变量,修饰指针变量名的
*p的运算:s1;拿p中的地址到内存定位  ;  s2:定位处偏移基类型大小的空间 ; s3:被当作了基类型变量来看

3.注意事项:指针变量的大小 64位(8字节), 32(四字节) ; 指针类型存储的是地址,特殊的数据   ;    指针变量的给值:int  *p     ---   野指针,没有初始化,被当作了地址,所以要避免野指针,一般初始化为 NULL

4.指针的核心用途:被调函数修改主调
用法:修改谁就传谁的地址       ;    *p的运算---间接访问 

5.指针+ 一维整型数组(指针操作一维)
int a[10];; int *p=a;
*(p+i)  ==  int 型变量               a[i] == p[i] == *(a+i)

6.关系运算:
b>q  ;  b<q  ; &  ;  *    ;  
p-q (前提是同一类型的指针,表示之间差了几个基类型)
指针不能做加法运算

迭代运算:本质就是可以利用指针访问到每一个元素的地址

迭代实现选择排序冒泡排序:

选择排序:

冒泡排序:


三,快速排序(时间复杂度为 n *log n)

快速排序本质就是定义一个基准值,通过从右向左找最大值,再从左向右找最小值,交换,然后循环直至begin和end相等时,此时划分两个部分,然后分别定义基准值重复找数换位的步骤,直至begin>end的时候结束。

快速排序示意图:

快速排序的程序:

  1. void quickSort(int *begin,int *end) //快速排序
  2. {
  3. int *p = begin; //记录开始的位置和最右边的位置
  4. int *q= end;
  5. int *k = begin; //第一步,确定基准值,a[0]
  6. if(begin>end) //结束递归的条件
  7. {
  8. return ;
  9. }
  10. while(begin<end) //begin 和 end 不能反过来,而且直到它们相遇停止循环
  11. {
  12. while(begin < end && *end >= *k) //第二步,从右边(最后一项)开始找,找到第一个比基准值小的值
  13. {
  14. --end; //没找的话向前移位
  15. }
  16. while(begin < end && *begin <= *k) //第三步,从左边(a【0】)开始找,找到第一个比基准值大的值
  17. {
  18. begin++; //没找到向后移位
  19. }
  20. swap(begin,end); //最大值最小值都找到了,进行它俩的换位
  21. } //回到循环起始点,接着找最大值最小值
  22. swap(begin,k); //此时相遇位置上的值与基准值交换
  23. quickSort(p,end-1); //针对数小的一部分,此时begin为开始的a【0】,end为end地址中的新end-1
  24. quickSort(begin+1,q); //针对数字大的部分,此时begin为地址begin+1,end为开始的end
  25. }

四,指针+ 一维字符型数组

char *p = s ;   s就是数组首元素的地址

int puts(const char *s);
const char *S;
const int a;//只读变量
int a=10;
const int*p=&a; //表示基类型 为只读
p---指针变量--本身的类型int*
a---int型变量--本身类型int

const char * 的好处:
1.可以接收字符数组名,也可以接受字符串常量,提高了参数的适用性
2.避免了可能出现的修改的操作,也可以将运行时的错误,提前到编译时发现


四,相关程序

1.数组的逆序,指针。
 

  1. void nixuArray(int *begin, int *end) //逆序,纯指针形式
  2. {
  3. while(begin<end)
  4. {
  5. int t = *begin;
  6. *begin = *end;
  7. *end = t;
  8. ++begin;
  9. --end;
  10. }
  11. }

2.插入排序

  1. void paixuArray(int *begin,int *end) //插入排序,纯指针
  2. {
  3. int *p =begin;
  4. int *q =NULL;
  5. for(p=begin;p<=end;p++)
  6. {
  7. int t = *p;
  8. q=p;
  9. while(q>begin&&*(q-1)>t)
  10. {
  11. *q=*(q-1);
  12. --q;
  13. }
  14. *q=t;
  15. }
  16. }

3.二分查找

  1. int *binaryD(int *begin,int *end,int n) //二分查找
  2. {
  3. int *mid=NULL;
  4. mid = begin+(end-begin+1)/2;
  5. int *ret=NULL;
  6. if(begin>end)
  7. {
  8. ret = NULL;
  9. }
  10. if(*mid>n)
  11. {
  12. end=mid-1;
  13. ret = binaryD(begin,end,n);
  14. }else if(*mid<n)
  15. {
  16. begin=mid+1;
  17. ret = binaryD(begin,end,n);
  18. }else
  19. {
  20. ret = mid;
  21. }
  22. return ret;
  23. }

4.输入/输出字符串

  1. void Gets(char *s) //输入字符串
  2. {
  3. do
  4. {
  5. *s = getchar();
  6. }while(*s++!='\n');
  7. s--;
  8. *s='\0';
  9. }
  10. void Puts(const char *p) //输出字符串
  11. {
  12. while(*p!='\0')
  13. {
  14. putchar(*p);
  15. ++p;
  16. }
  17. putchar('\n');
  18. }

5.相关输出

  1. int main(void)
  2. {
  3. int a[5]={1,2,4,3,5};
  4. int i=0;
  5. //nixuArray(a,a+4); //逆序的输出
  6. //paixuArray(a,a+4); //排序的输出(charu)
  7. //int x=3;
  8. //int *ret = binaryD(a,a+4,5);
  9. //printf("%d\n",*ret); //二分查找的输出
  10. //for(i=0;i<5;i++)
  11. //{
  12. //printf("%d",a[i]);
  13. //}
  14. //putchar('\n');
  15. return 0;
  16. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号