在以前存储数据都是运用磁盘的,磁盘的存储是顺序存储,中间不连续的剩余空间,是存储不了大于他们内存空间的东西,会降低磁盘的存储效率,所以需要整理,删除等维护处理。
指针变量是存储地址变量,存地址而已,比如电影票上就是存的地址,通过电影票上的地址找到自己的位置,然后坐在那就相当于将自己存到里面,指针就是通过中间者找到位置,不需要知道找的内容是什么。
内存地址的大小于操作系统的位数有关。
int a = 100; //a是4个字节
int *p = &a; //* 和 int 在一起是指定义整型的指针变量;(变量名)p保存的是a的地址;p是8个字节;
*p = 213; //相当于 a = 213, 间接访问;
printf(“%d\n”, a);
int *p = null; //指向0的地址,存着8个字节的0, null可以写0, 但是写null 语义更加明确!
//地址的输出是以16进制方式输出的
//指针 间接寻找的内容的大小, 算数运算跳转的空间数量,int 类型跳4个字节
int a = 3;
int *p = &a;
printf("&a = %p\n", &a);
printf("p = %p\n", p);
既然初步认识了指针,那么我们就可以写指针形式的冒泡排序, 选择排序, 插入排序 和 折半查找;
//冒泡排序
int a[] = {2, 4, 5, 8, 6, 1, 3, 9};
int count = sizeof(a) / sizeof(*a);
int flag = 1;
for (int i = 0; i < count - 1 && 1 == flag; i++) {
flag = 0;
for (int j = 0; j < count - i - 1; j++) {
if (*(a + j) > *(a + j - 1)) {
int temp = 0;
temp = *(a + j);
*(a + j) = *(a + j - 1);
*(a + j - 1) = temp;
flag = 1;
}
}
}
for (int i = 0; i < count; i++) {
printf("%d\n", *(a + i));
}
//选择排序
int a[] = {2, 4, 5, 8, 6, 1, 3, 9};
int count = sizeof(a) / sizeof(*a);
for (int i = 0; i < count - 1; i++) {
int minIndex = i;
for (int j = minIndex + 1; j < count; j++) {
if (*(a + minIndex) > *(a + j)) {
minIndex = j;
}
if (minIndex != i) {
int temp = 0;
temp = *(a + minIndex);
*(a + minIndex) = *(a + i);
*(a + i) = temp;
}
}
for (int i = 0; i < count; i++) {
printf("%d\n", *(a + i));
}
//插入排序
int a[] = {2, 4, 5, 8, 6, 1, 3, 9};
int count = sizeof(a) / sizeof(*a);
for (int i = 1; i < count; i++) {
int j = i;
int temp = *(a + j);
while (j > 0 && temp < *(a + j - 1)) {
*(a + j) = *(a + j - 1);
j--;
}
*(a + j) = temp;
}
for (int i = 0; i < count; i++) {
printf("%d\n", *(a + i));
}
//折半查找
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int count = sizeof(a) / sizeof(*a);
int start = 0, end = count - 1, mid = 0;
int x = 0;
printf("请输入你要找的数字:");
scanf("%d", &x);
while (start <= end) {
mid = (start + end) / 2;
if(*(a + mid) == x) {
printf("%d是第%d的位置\n", x, mid);
break;
} else if (*(a + mid) > x) {
end = mid - 1;
} else {
start = mid + 1;
}
}
if (*(a + mid) != x) {
printf("no\n");
}