1.对数组指针的理解: 本质任然是指针,指向的是数组 :eg:char (*a)[] 这个数组指针的含义就是 指针a指向一个数组,数组里面的元素为char类型 2.对函数指针的理解: 本质是指针,指针指向一个函数:eg:int (*a)() 这个函数指针的含义就是 指针a指向一个函数,这个函数的返回值是int类型 3.对函数指针数组的理解: 本质是一个数组,eg:int *a 这个函数指针数组的含义就是 数组a里面保存的是指针,这个指针指向一个函数,该函数的返回值是int类型 转移表:一个指针数组,指向一个函数,数组里面是要调用的子函数,这些子函数的参数也就是这个调用函数的函数的参数 4.对指向函数指针数组的指针的理解: 5.回调函数:把一个函数指针作为参数传递给函数,然后函数“回调”函数指针指向的用户函数,这样的函数就称为回调函数 回调函数的使用:回调函数一般在使用的过程中是在一定的情况下使用的,就是使用需要一定的条件,并不是直接调用,而是当某一条件满足的时候才会调用,这个时候函数指针指向这个函数,函数也就发生了回调 6.例:`#include <stdio.h> #include <stdlib.h> #include <string.h>
//数据类型、整形在内存中的存储、大小端、浮点型在内存的存储 #if 1 int check_sys(){ int i = 1; return (*(char *)&i); } int main(){ int ret = check_sys(); if (ret == 1){ printf(“小端\n”); } else { printf(“大端\n”); } system(“pause”); return 0; } #endif
#if 1 int main(){ char a = -1; signed char b = -1; unsigned char c = -1;//unsigned 类型 系统不会将第一个二进制位看成符号位 printf(“a=%d,b=%d,c=%d”, a, b, c);//所有-1就是直接将-1的二进制1111 1111转成十进制输出 system(“pause”); return 0; } #endif
#if 1 int main(){ char a = -128; printf("%u\n", a); system(“pause”); return 0; } #endif
#if 1 int main(){ int i=-20; unsigned int j=10;//任何数和unsigned进行运算,都会转成unsigned类型 printf("%d\n",i+j); system(“pause”); return 0; } #endif
#if 1 int main(){ unsigned int i;//死循环 因为unsigned是非负的 for (i=9;i>=0;++i) { printf("%u\n",i); } system(“pause”); return 0; } #endif
#if 1 int main(){ char a[1000]; int i;//死循环 因为char类型的范围是-128–+127,永远达不到1000 for (i = 0; i < 1000; ++i){ a[i] = -1 - i; } printf("%d", strlen(a)); system(“pause”); return 0; } #endif
#if 1 unsigned char i = 0; int main(){ for (i = 0; i <= 25; ++i){ printf(“hellow world\n”); } system(“pause”); return 0; } #endif
#if 1 int main(){ int n=9; float *pFloat=(float *)&n;//参考float类型的二进制存储 printf(“n的值为:%d\n”,n); printf("*pFloat的值为:%d\n",*pFloat);
*pFloat=9.0; printf("num的值为:%d\n",n); printf("*pFloat的值为:%d\n",*pFloat); system("pause"); return 0;} #endif
//字符指针、数据指针、指针数组、函数指针、数组传参和指针传参、 //函数指针数组、指向函数指针数组的指针、回调函数、 #if 1 int main(){ int arr[10] = { 0 }; printf("%p\n", arr);//arr表示指向数组的首元素的首地址的指针 printf("%p\n", &arr);//&arr同样表示指向数组的指针,也就是指向数组首元素 system(“pause”); return 0; } #endif
#if 1 int main(){ int arr[10]={0}; printf(“arr=%p\n”,arr); printf("&arr=%p\n",&arr);
printf("arr+1=%p\n",arr+1);//arr+1 加的是元素 printf("&arr+1=%p\n",&arr+1);//&arr+1 加的是整个数组 system("pause"); return 0;} #endif
#if 1 void print_arr1(int arr[3][5], int row, int col){ int i = 0, j = 0;
for (i = 0; i < row; ++i){ for (j = 0; j < col; ++j){ } }} int main(){
system("pause"); return 0;} #endif`
7.使用qsort函数排序各种类型的数据 使用qsort函数给数组进行排序
int int_cmp(const void*p1, const void*p2) { return (*(int *)p1 > *(int *)p2); } int main(){ int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 }; int i = 0; qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp); for (i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i){ printf("%d\n", arr[i]); } printf("\n"); system("pause"); return 0; }使用qsort函数对字符排序
#include <stdio.h> #include <stdlib.h> #include <string.h> int int_cmp(const void*p1, const void*p2) { return strcmp(*(char **)p1, *(char **)p2); } int main(){ char* arr[] = {"sasueahi","adada","dagwg"}; int size = sizeof(arr) / sizeof(arr[0]); int i = 0; qsort(arr, size, sizeof(char*), int_cmp); for (i = 0; i < size; ++i){ printf("%s\n", arr[i]); } printf("\n"); system("pause"); return 0; }模仿qsort的功能实现一个通用的冒泡排序
int int_cmp(const void*p1, const void*p2) { return (*(int *)p1 > *(int *)p2); } void _swap(void *p1, void *p2, int size){ int i = 0; for (i = 0; i < size; ++i){ char tmp = *((char *)p1 + i); *((char *)p1 + i) = *((char *)p2 + i); *((char *)p2 + i) = tmp; } } void bubble(void *base, int count, int size, int(*cmp)(void *, void *)){ int i = 0, j = 0; for (i = 0; i < count - 1; ++i){ for (j = 0; j < count - i - 1; ++j){ if (cmp((char *)base + j*size, (char *)base + (j + 1)*size)>0){ _swap((char *)base + j*size, (char *)base + (j + 1)*size, size); } } } } int main(){ int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 }; //char *arr[] = {"aaaa","dddd","cccc","bbbb"}; int i = 0; bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp); for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++) { printf("%d ", arr[i]); } printf("\n"); system("pause"); return 0; }运用qsort函数的排序中,不论是对数组进行排序还是字符串排序,重点是对于compare函数的书写