您好,登錄后才能下訂單哦!
1.數組指針
數組指針是指針,指針指向數組,其內部保存的是數組的地址,只要是指針,就占4個字節。
比如:
int arr[5]; //數組
int *parr1[10]; //指針數組
int (*parr2)[10];//數組指針
int (*parr3[10])[5]; //數組指針數組
解釋:命名規則按照操作符的優先級來決定。
2.函數指針和定義
比如:
#include <stdio.h>
void test()
{
printf("hehe\n");
}
int main()
{
printf("%p\n", test);
printf("%p\n", &test);
return 0;
}
運行結果:
輸出的是兩個地址,這兩個地址是 test 函數的地址。 那我們的函數的地址要想保存起來,怎么保存? 下面我們看代 碼:
void test()
{
printf("hehe\n");
} //下面pfun1和pfun2哪個有能力存放test函數的地址?
void (*pfun1)();
void *pfun2();
首先,能給存儲地址,就要求pfun1或者pfun2是指針,那么答案就是:pfun1可以存放。pfun1先和*結合,說明pfun1是指針,指針指向的是一個函數,指向的函數無參數,返回值 類型為void。
3.函數指針數組和定義,轉移表
int (*parr1[10]])(); //函數指針數組
int *parr2[10](); //指針函數數組
4.指向函數指針數組的指針和定義
void test(const char* str)
{
printf("%s\n", str);
}
int main()
{
//函數指針pfun
void (*pfun)(const char*) = test;
//函數指針的數組pfunArr
void (*pfunArr[5])(const char* str);
pfunArr[0] = test; //指向函數指針數組pfunArr的指針ppfunArr
void (*(*ppfunArr)[10])(const char*) = &pfunArr;
return 0;
}
5.回調函數的使用
回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這 個指針被用來調用其所指向的函數時,我們就說這是回調函數。
注:回調函數不是由該函數的實現方直接調用,而 是在特定的事件或條件發生時由另外的一方調用的,用于對該事件或條件進行響應。
7.使用qsort函數排序各種類型的數據。
#include <stdio.h>
#include<stdlib.h>
//qosrt函數的使用者得實現一個比較函數
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 ", arr[i]);
}
printf("\n");
system("pause");
return 0;
}
運行結果:
8.模仿qsort的功能實現一個通用的冒泡排序。
#include <stdio.h>
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;
int 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 };
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");
return 0;
}
運行結果:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。