赞
踩
目录
如果指针没有初始化,此时是随机值----野指针
此时分配到的地址是随机值,访问到不能访问的地址,会报段错误
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);//右一半递归
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。