指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为参数,泛型函数
1、指針數組
?? 數組里面的每個元素都是指針。
?? 指針數組的案例如下:
?? 易犯錯誤:
2、數組指針
? 歸根結底還是指針,只是取*的時候能夠取出一整個數組出來。
數組指針:(一個指針指向了數組,一般和二維數組搭配使用)。
下面的(p+1)表示的是加過20個字符。
?
3、函數指針:
在gcc編譯的時候增加一些調試信息的方式是:
gcc demo.c –g –o app?? -g表示增加一些調試信息
objdump –dSsx app > file?? 將app反匯編,然后重定向到file文件中。函數指針定義:
?
4、指針作為參數
| ? | sizeof(p) | sizeof(*p) | p+1 |
| char *? p[10] | 40 | 4 | 加過4個Byte |
| char **p | 4 | 4?? 注意sizeof(**P)= 1 | 加過4個字節 |
| char (*p)(void) 函數指針 | 4 | 無大小 | 無意義 |
| char (*p)[20]? 數組指針 | ? | ? | 20 |
?
5、main函數實質介紹:
?
6、二重指針:
指針數組和二重指針實際上是等價的。
?
7、數組指針等價于二維數組:
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
8、函數指針作為函數的參數
?
9、泛型函數:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
?
void show_arry(int a[], int n)
{
???????? inti;
???????? for(i = 0; i < n; i++)
?????????????????? printf("%d\n",a[i]);
???????? putchar('\n');
}
void init_arry(int a[], int n)
{
???????? inti;
???????? srand(time(NULL));
???????? for(i = 0; i < n; i++)
?????????????????? a[i]= rand() % 100;
}
int cmp_int(void *a, void *b)
{
???????? intx = *((int *)a);
???????? inty = *((int *)b);
???????? returnx > y;
}
void swap_int(void *a, void *b)
{
???????? inttmp;
???????? tmp= *((int *)a);
???????? *((int*)a) = *((int *)b);
???????? *((int*)b) = tmp;
}
//泛型模板是通過void *的方式得到的。
void bubble_sort(void *a, int n,int(*cmp)(void *, void *), void (*swap)(void *, void *))
{
???????? inti, j;
???????? for(i = 0; i < n; i++)
?????????????????? for(j = 0; j < n-i-1; j++)
??????????????????????????? if(cmp((void *)((int *)a+j), (void *)((int *)a+j+1)) > 0)
??????????????? //注意這里的(int*)只是告訴編譯器傳遞的是4個字節的長度,對于float的也是四字節的。
???????????????????????????????????? swap((void*)((int *)a+j), (void*)((int*)a+j+1));
}
/*
int main(void)
{
???????? inta[10];
???????? init_arry(a,10);
???????? show_arry(a,10);
???????? bubble_sort(a,10, cmp_int, swap_int);
???????? show_arry(a,10);
}
*/
int cmp_float(void *a, void * b)
{
???????? return*((float *)a) > *((float *)b);
}
void swap_float(void *a, void *b)
{
???????? floattmp;
???????? tmp= *((float *)a);
???????? *((float*)a) = *((float *)b);
???????? *((float*)b) = tmp;
?
}
void show_float(float a[], int n)
{
???????? inti;
???????? for(i = 0; i < n; i++)
?????????????????? printf("%f\n",a[i]);
???????? putchar('\n');
}
int main(void)
{
???????? floata[5] = {1.3, 4.5, 2.3, 1.2, 3.7};
???????? bubble_sort(a,5, cmp_float, swap_float);
???????? show_float(a,5);
}
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为参数,泛型函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 部队离休干部遗属物业补贴
- 下一篇: 怎么进bios界面设置U起 电脑如何进入