指針是一個特殊的變量,它裏面存儲的數值被解釋成爲內存裏的一個地址。
學習好指針必須要從四個方面入手:
1、指針的類型
2、指針所指向的類型
3、指針的值或者叫指針所指向的內存區
4、還有指針本身所佔據的內存區
例如1:
a. int *ptr;
b. char *ptr;
c. int **ptr;
d. int (*ptr)[3];
e. int *(*ptr)[4];
一、指針類型
int *ptr; // 指針類型是int*
char *ptr; // 指針類型是char*
int **ptr; // 指針類型是int**
int (*ptr)[3]; // 指針類型是int(*)[3]
int *(*ptr)[4]; // 指針類型是int*(*)[4]
二、指針所指向的類型
當我們通過指針來訪問指針所指向的內存區時,指針所指向的類型決定了編譯器將把計算機那塊內存區域裏的內容當做什麼來看待。從語法上看,你只須把指針聲明語句中的指針名字和名字左邊的指針的聲明符*去掉,剩下的就是指針所指向的類型。
f. int *ptr; // 指針所指向的類型是int
g. char *ptr; // 指針所指向的類型是char
h. int **ptr; // 指針所指向的類型是int *
i. int (*ptr)[3]; // 指針所指向的類型是int()[3]
j. int *(*ptr)[4]; // 指針所指向的類型是int*()[4]
送給大家一句:重要在於實戰、多手動編寫代碼,這纔是學好C語言的關鍵,多多參加項目企業實戰技術。
1、指針類型剖析
int p; // 普通的整型變量
int *p; // 普通的整型指針變量
int p[3]; // 整型數據類型的數組
int *p[3]; // 說明數組裏面元素是指針類型,返回整型數據的指針所組成的數組
int (*)p[5]; // 說明指針所指向類型是一個數組,然後再與int結合,說明數組裏面的元素是整型的,所以p是一個指向整型數據組成的數組的指針。
int **p; // 說明指針所指向的元素是指針
int p(int); // p是函數,該函數有一個參數爲整型,說明函數返回值int。說明p是一個有整型參數且返回類型是int的函數
int (*p)(int); // p是一個指向有一個整型參數且返回類型爲整型的函數的指針。
int *(*p(int))[5]; // 首先要從p開始,先與()結合,然後進入()裏面,與int結合,說明函數有一個整型變量參數;然後再與外面的*結合,說明函數返回的是一個指針;然後到最外面一層,先與[]結合,說明返回的指針指向的是一個數組;然後再與*結合,說明數組的元素是指針;然後再和int結合,說明指針指向的內容是整型數據,所以p是一個參數爲一個整型且返回一個指向由整型指針變量組成的數組的指針變量的函數。
2、指針類型轉換
當我們初始化一個指針或指針賦值時候,賦值號左右兩邊類型不一致的情況下,此時需要進行強制轉換。
語法:(TYPE*)p;
三、指針數組和數組指針 加小編的羣466572167,可以交流學習,羣內也有資料下載學習
指針數組:用於存儲指針的數組,也就是數組元素都是指針。
數組指針:指向數組的指針。
例如:
int *a[10]; // 指針數組
表示:數組a中的元素都爲int型指針,元素表示:*a[i] *(a[i])是一樣,因爲[]優先級別高於*。
int (*a)[10]; // 數組指針
表示:指向數組a的指針 ,元素表示:(*a)[i]。在實際應用中,對於指針數據,我們大家都會經常這樣使用。
typedef int* pInt;
pInt a[10];
代碼實現:
// PSProject.cpp : 定義控制檯應用程序的入口點。
//
#include"stdafx.h"
#include<iostream>
usingnamespace std;
int_tmain(intargc, _TCHAR* argv[])
{
int Arr[4] = { 10, 20, 30, 40 }; // Arr[0] Arr[1] Arr[2] Arr[3]
int *a[4]; // 指針數組 有四個指針:a[0] a[1] a[2] a[3]
int (*b)[4]; // 數組指針 指針(這個指針可以指向數組)
b = &Arr; // 將Arr數據地址賦給b的這個數組指針
for (int i = 0; i < 4;i++)
{
a[i] = &Arr[i];
}
cout << "Result="<<*a[1] << endl;
cout << "Result=" << (*b)[2] << endl;
return 0;
}
運行效果:
四、函數指針與指針函數
函數指針:首先它是一個指針,只是這個指針指向的是一函數。指針變量可以指向變量的地址、數組、字符串、動態分配地址,同時也可以指向一個函數,每個函數在編譯的時候,系統會分配給該函數一個入口地址,函數名錶示這個入口,那麼指向指針變量稱爲函數指針變量。
聲明格式如下:
類型說明符 (*函數名)(參數)
例如:
void (*fptr)();
賦值:
fptr=&function;
fptr=function;
如果函數調用,還必須包括圓括號的參數表。
兩種方式來通過指針調用函數:
x=(*fptr)();
x=fptr();
指針函數:首先它是一個函數,只不過這個函數的返回值是一個地址值。函數返回值必須使用同類型的指針變量來接受,也就是說,指針函數一定有函數返回值,而且,在主調函數中,函數返回值必須給同類型的指針變量。