一.指针
1.1指针就是一种专门存放地址的数据类型
int i = 10;//在32位操作系统,在栈区开辟了一个四字节的空间存放变量i的值
int *p = &i;//在32位操作系统,在栈区开辟了一个四字节的空间p指针存放i的地址
printf("%d\n",*p);//*p表示访问i,将输出i的数值10
注意:
int *p表示定义p为整数型指针
*p中的*表示指针运算符,访问p指针中存放的地址i
指针类型需要与所存地址类型相同,int *p存放int类型数据地址
指针在不同操作系统中所占字节不同,在32位是4字节,64位8字节
1.2在主函数定义的变量,在调用其他函数若想改变主函数的变量可以通过指针实现
void fn(int a)
{
a++;
}
void fn1(int *a)
{
*a++;
}
int main()
{
int i = 10;
printf("%d\n",(fni));//显示的仍为10,函数进程结束后就会释放i
printf("%d\n",fn1(i));//将显示的为11,i通过指针所保存的地址直接改变i的值
return 0;
}
1.3指针运算符*操作过程:
在指针中&与*可以相互抵消,但还是需注意*后面需要跟指针变量
int main(void)
{
int i = 10;
int *p = &i;
printf("%p\n", &*p);//输出i的地址
printf("%d\n", *&i);//输出变量i = 10
printf("%p\n", *&p);//输出i的地址
printf("%d\n", &*i);//无法编译 因为*要求操作对象必须为指针但i是整型
return 0;
}
指针还可以强转数据类型,将字节大的数据类型强转为字节小的
p = (char *)&i;
注意:
指针可以进行加减操作
指针与指针间不能加法操作,但可以进行减法,判断两个指针的之间差了几个基类型
int i = 10;
int *p = &i;
p + 1;// p指针加上1*sizeof(基类型)字节,
1.4指针与数组
一维数组的数组名就是指针
int a[] = {1,2,3,4,5};
int *p;
p = a;//p = &a[0]
p += 1;//p = &a[1]
通过指针编写数组相关函数:
#include <stdio.h>
void printArray(int *a, int len)
{
int i;
for(i = 0;i < len;++i)
{
printf("%d\n", *(a + i));
}
}
int sumOfArray(int *a, int len)
{
int sum = 0, i;
for(i = 0;i < len;++i)
{
sum += *(a + i);
}
return sum;
}
void swap(int *a,int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
void reverseorder(int *a,int len)
{
int i;
for(i = 0;i < len / 2;i++)
{
swap((a + i),(a + len - i - 1));
}
for(i = 0;i < len;i++)
{
printf("%d\n",*(a + i));
}
}
void ordersort(int *a,int len)
{
int i;
for(i = 0;i < len - 1;i++)
{
for(int j = i + 1;j < len;j++)
{
if(*(a + i) > *(a + j))
{
swap(a + i,a + j);
}
}
}
for(i = 0;i < len;i++)
{
printf("%d ",*(a + i));
}
}
void maopaosort(int *a,int len)
{
int i,j;
for(i = len - 1;i > 0;i--)
{
for(j = 0;j < i;j++)
{
if(*(a + j) > *(a + j + 1))
{
swap(a + j,a + j + 1);
}
}
}
for(i = 0;i < len;i++)
{
printf("%d ",*(a + i));
}
}
void insertsort(int *a,int len)
{
int i,j;
for(i = 1;i < len;i++)
{
int t = *(a + i);
j = i;
while(j > 0 && *(a + j - 1) > t)
{
*(a + j) = *(a + j - 1);
j--;
}
*(a + j) = t;
}
for(i = 0;i < len;i++)
{
printf("%d ",*(a + i));
}
}
int *midFind(int *a,int len,int n)
{
int begin = 0;
int end = len - 1;
while(begin <= end)
{
int mid = (begin + end) / 2;
if(*(a + mid) > n)
{
end = mid - 1;
}
else if(*(a + mid) < n)
{
begin = mid + 1;
}
else
{
return a + mid;
}
return NULL;
}
}
int main()
{
int a[] = {1,-2,3,-4,5,-6,7,-8,9,0};
int len = sizeof(a) / sizeof(a[0]);
// maopaosort(a,len);
// insertsort(a,len);
// reverseorder(a,len);
ordersort(a,len);
int *ret = midFind(a,len,-6);
if(ret == NULL)
{
printf("not found\n");
}
else
{
printf("%p %d\n",ret,*ret);
}
return 0;
}