1. 程式人生 > >指針數組,數組指針,函數指針,main函數實質,二重指針,函數指針作為參數,泛型函數

指針數組,數組指針,函數指針,main函數實質,二重指針,函數指針作為參數,泛型函數

family nbsp att 技術 犯錯 nor 編譯器 pos 一個

??

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

加過4Byte

char **p

4

4 註意sizeof**P= 1

加過4個字節

char (*p)(void) 函數指針

4

無大小

無意義

char (*p)[20] 數組指針

20

5main函數實質介紹:

技術分享

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);

}

指針數組,數組指針,函數指針,main函數實質,二重指針,函數指針作為參數,泛型函數