指针:存放内存单元地址的变量,放在指针中的值都被当成地址处理,一个字节给一个对应的地址。
指针是用来存放地址的,地址是唯一标示一块地址空间的。 指针的大小在32位平台是4个字节,在64位平台是8个字节。
指针的定义:type + * ,指针的类型决定了指针向前或者向后走一步有多大(距离)。指针的类型决定了,对指针解引用的时候有多大的权限 (能操作几个字节)。
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个 元素之前的那个内存位置的指针进行比较。
指针和数组没有联系,只是在使用上有许多相似性(访问时都可以用解引用操作符和中括号)。
数组名代表数组的首元素的地址,&数组名代表整个数组的地址,因为大小端问题,数组名和&数组名的值是相同的,可是含义却不一样,数组名+1 是下一个元素的地址,&数组名+1 是下一个数组的地址。
二级指针是存放一级指针地址的指针。
指针数组是存放指针的数组。
数组指针是指向数组的指针。
函数指针是存放函数地址的指针。
函数指针数组:将函数地址存放在数组中,将这个数组称为函数指针数组。
qsort 的应用以及实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<assert.h>
//qsort的使用
int Cmp(const void* xp,const void* yp)
{
int *x = (int *)xp;
int *y = (int *)yp;
if (*x > *y){
return 1;
}
else if (*x < *y)
{
return -1;
}
else return 0;
}
void Show(int arr[],int num)
{
int i = 0;
for (i = 0; i < num; i++)
printf("%d ", arr[i]);
printf("\n");
}
void swap(char *x, char *y, int size)
{
int i = 0;
for (i = 0; i < size; i++)
{
char temp = *x;
*x = *y;
*y = temp;
x++;
y++;
}
}
void My_qsort(void* base, int num, int size, int(*cmp)(const void*, const void*))
{
assert(base);
assert(cmp);
int i = 0;
char *start =(char*)base;
for (i = 0; i < num - 1; i++)
{
int j = 0;
int flag = 0;
for (j = 0; j < num - 1 - i; j++)
{
flag = 1;
if (cmp(start + j*size, start + (j + 1)*size)>0)
{
swap(start + j*size, start + (j + 1)*size,size);
}
}
if (!flag)
break;
}
}
int main()
{
int arr[] = { 123, 345, 23, 3, 7, 9, 1, 8, 34 };
int num = sizeof(arr) / sizeof(arr[0]);
Show(arr, num);
//qsort(arr, num, sizeof(int), Cmp);
My_qsort(arr, num, sizeof(int), Cmp);
Show(arr, num);
system("pause");
return 0;
}