指針數組,數組指針,函數指針,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);
}
指針數組,數組指針,函數指針,main函數實質,二重指針,函數指針作為參數,泛型函數