指針用途:
1、使程序簡潔、緊湊、高效
2、內存的動態分配
3、內存地址的直接處理
4、函數調用時批量參數的傳遞
5、複雜數據結構的簡潔表達等許多其它數據類型難以實現的複雜操作
等等……
一、 多級指針
1、爲什麼需要使用二級指針
------使用二級指針是爲了函數調用結束可以使作爲函數實參的指針的值的改變保留下來
------數據結構鏈表和二叉樹當中經常用到二級指針
2、const?
char const *p; // 所有數據不可更改,也就是說*p是常量字符串
char *const p; // 指針變量是不可更改,也就說指針只能指向一個地址,不能更改爲其它地址
char const*const p; // 內容和指針都不能更改
const char* const p; // 同上,內容和指針不更改
備註:*作爲分界線,在*左有const就說明內容不能更改;在*右邊就說明指針不能更改;而左邊的const和char順序無關。
3、二級指針
指向指針的指針,稱爲二級指針,用於存放二級指針的變量稱爲二級指針變量。二級指針又分爲爲指向指針變量的指針和指向數組的指針。
指向數組的指針:數組與其它變量在使用上有很大的不同,無論是字符型、整型等,或是結構體類型或者指針類型的變量。
設計工程案例:
// 程序名稱:指針應用
#include"stdafx.h"
#include<stdio.h>// 聲明C語言標準頭文件
int_tmain(intargc, _TCHAR* argv[])
{
int a[5] = {10,20,30,40,50}; // 聲明普通數組,且初始化
int *sum[5]; // 聲明指針數組
// 初始化指針數組
for (int i = 0; i < 5; i++)
{
sum[i] = &a[i]; // sum[0]=&a[0] sum[1]=&a[1].........
}
// 聲明二級指針
int **p;
p = sum; // 初始化二級指針
for (int i = 0; i < 5; i++)
printf("%4d",**(p++));
return 0;
}
一、 指針函數和函數指針
1、指針函數
指針函數是指針帶指針的函數,即本質是一個函數。函數都有返回類型(如果不返回值,則爲無值型),只不過指針函數返回類型是某一類型的指針。
定義格式
類型名 *函數名(函數參數列表);
其中,後綴運算符括號”()”表示這是一個函數,其前綴運算符星號”*”表示此函數爲指針型函數,其函數值爲指針,即它帶回來的值的類型爲指針,當我們調用這個函數後,將得到一個“指向返回值的爲…的指針(地址),類型名錶示函數返回的指針指向的類型。
例如:int *pFun(int ,int); // *號優先級低於(),pFun首先和後面的()結合運算,pFun是一個函數。即:
int *(pFun(int,int));
設計工程案例:
// 程序名稱:指針應用
// 統計三位學生的成績
#include"stdafx.h"
#include<stdio.h>
float *Find(float (*pointer)[4], intn) // 定義指針函數
{
float *pt;
pt = *(pointer + n);
return (pt);
}
int_tmain(intargc, _TCHAR* argv[])
{
staticfloat score[][4] = { {98,65,99,91}, {56,63,19,80}, {88,77,69,100} };
float *Pf;
int i, m;
printf("請輸入要查詢的編號:");
scanf("%d",&m);
printf("The Score of N0.%d are:",m);
Pf = Find(score, m - 1);
for (int i = 0; i < 4;i++)
printf("%6.2f ",*(Pf+i));
printf("");
return 0;
}