C语言指针总结

指针:存放内存单元地址的变量,放在指针中的值都被当成地址处理,一个字节给一个对应的地址。
指针是用来存放地址的,地址是唯一标示一块地址空间的。 指针的大小在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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值