指標 陣列 函式
關於函式、指標、陣列在學習的過程中關於指標 指標函式 函式指標 陣列指標 指標陣列很容易搞混,所以在這裡詳細的比較一下:
關於指標:關於複雜型別的指標,理解的時候主要是根據運算子的優先順序從變數名開始來一步一步分解的
簡單的型別就不舉例了這個地方主要解釋一下指標陣列和陣列指標
int *p[3]:
(指標陣列 相當於 陣列元素都是指標)
1.首先從變數名p開始和[3]結合(「[ ]」
優先順序比*高),說明是乙個陣列;
2.再和*結合說明陣列元素是指標型別的;
3.最後和int結合 說明指標指向的內容是int型別的;
所以 p是乙個由指向int型別資料的指標所組成的陣列
int (*p)[3]:(陣列指標 相當於 指向陣列的指標)
1.首先從變數名開始由於()的 優先順序較高 所以p和*結合是乙個指標
2.之後再和」」
結合 說明指標指向的是乙個陣列
3.最後和int結合說明陣列中的資料都是int型別的
所以p是乙個指向有int型別的資料組成的陣列的指標
int **p(這個地方主要是和函式的值傳遞有關)
指向指標的指標 int型別的說明一級指標所指向的元素是int型別的
指標的指標即是指標的位址
在利用指標引數去申請記憶體的時候 可以看到它和一般指標引數的區別
還有就是指向指標的指標可以用於訪問二位陣列
在自己嘗試這使用二級指標的時候所犯的錯誤:
#include
int main()
int arr[2][2] = ,};
int **ptr = null;
ptr = arr;
printf("arr[0][0] = %4d\n", ptr[0][0]);
printf("arr[0][1] = %4d\n", ptr[0][1]);
除錯的時候總是段錯誤(
分析的時候
:arr
所代表的就是二維陣列的首位址 也就是說
*ptr
對應的就是
arr[0][0]
的值 所以再使用
ptr去訪問的時候 會出現段錯誤
ptr就是乙個位址 所以這個地方訪問的時候 使用一維指標就可以了 沒有必要使用二維指標)
#include
int main()
int arr[2][2] = ,};
int *ptr = null;
ptr = arr;//得到陣列的首位址 之後 通過計算位置資訊 得到最後的值
printf("arr[0][0] = %4d\n", *ptr);
printf("arr[0][1] = %4d\n", *(ptr + 1));
還可以利用陣列指標進行訪問
#include
int main()
int arr[2][2] = ,};
int (*ptr)[2] = null;
ptr = arr;//得到陣列的首位址 之後 通過計算位置資訊 得到最後的值
printf("arr[0][0] = %4d\n", ptr[0][1]);
printf("arr[0][1] = %4d\n", ptr[1][1]);
二維指標訪問借助於指標陣列
#include
int main()
int arr[2][2] = ,};
int *ptr[2] = ;//相當於將二維陣列的第一行的首位址和第二行的首位址分別儲存在陣列中的兩個指標內
int **pptr = null;
pptr = ptr;//這個時候的
pptr
就和arr
等價了
printf("arr[0][0] = %4d\n", pptr[0][0]);
printf("arr[0][1] = %4d\n", pptr[0][1]);
printf("arr[1][1] = %4d\n", pptr[1][1]);
(小結:
指標陣列和陣列指標
int *ptr[5] 相當於分配了乙個空間為
5的陣列 每個元素都是乙個指標型別的 指標指向的是
int型別的值
int ( *ptr)[5] 相當於定義了未知個數的指標 每個指標指向的都是乙個一維個數為
5的陣列 內容是
int型別的資料
(#include
#include
int main()
int arr[3][2] = ,, };
int (*ptr)[2] = null;
ptr = arr;
printf("%4d\n", ptr[0][1]);
printf("%4d\n", ptr[1][1]);
printf("%4d\n", ptr[2][0]);
printf("%4d\n", ptr[2][1]);
}這個地方就是 只宣告了長度是2
的一維陣列 ))
int(*p)(int) 函式指標
1.p先和 * 結合 說明是乙個指標
2.之後和(int)結合 說明是乙個函式 即指標指向乙個函式 函式引數是int型別的
3.最後再和最外面的int結合 說明函式返回的是乙個int型別值
所以 p是乙個指向有乙個int型引數並且返回型別是int的函式的指標
指向函式的指標包含了函式的位址,可以通過它來呼叫函式(可以通過將函式的位址賦給這個指標)
int (*fptr)(int);定義函式指標
int function();
fptr = &function;或者直接是fptr = function;(通常單獨的乙個函式標示符表示的就是它的位址)
呼叫的時候:
int data;
data = (*fptr)();或者是data = fptr();例項如下:
#include
#include
#include
char *(*getmemory)(int num);
char *func(int num)
char *ptr = (char *)malloc(sizeof(char) * num);
return ptr;
int main()
getmemory = func;
char *str = null;
str = (*getmemory)(20);
strcpy(str,"hellowrold!\n");
printf("%s", str);
return 0;
指標函式 int *ptr(int )
返回值是乙個位址 位址指向的是乙個在堆區動態分配的記憶體區域
#include
#include
#include
char *getmemory(int num)
char *ptr = (char *)malloc(sizeof(char) * num);
return ptr;
int main()
char *str = null;
str = getmemory(20);
strcpy(str,"hellowrold!\n");
printf("%s", str);
return 0;
(小結:
指標函式和函式指標最主要的區別就是指標函式 本身就是乙個函式 只是函式的返回值是乙個指標 函式指標指的是乙個指標 這個指標指向的不是一塊記憶體 而指向的是乙個函式 內部的值是這個函式的首位址)
下面將分析乙個複雜的指標型別:
關於指標 我們需要分清楚:指標的型別 指標所指向的型別 指標本身所佔據的記憶體區和指標指向的記憶體區(就是指標的值)
指標的型別:只要把指標宣告語句中的指標的名字拿掉 剩餘的部分就是指標的型別
指標指向的資料型別:同上 只要將指標宣告語句中的指標名稱和之前的
」*」拿掉 剩餘的部分就是指標所指向的型別
(指標的型別和指標所指向的型別是兩個概念 尤其是在指標的算術運算中顯得尤為重要)
指標的值:是指標本身儲存的值,是乙個記憶體位址的值,指標所指向的記憶體區域的起始位址就是這個值,我們所說的指標指向某塊記憶體區域 就是值指標的值是這塊記憶體區域的首位址
指標本身所佔據的記憶體區:可以使用sizeof(指標的型別 進行判斷)32位平台中指標本身佔據了4個位元組
sizeof(char *)長度是4
指標的算數運算:
指標可以加上或減去乙個整數,指標的運算和普通的運算最大的區別就是 指標的元算是以單元為單位的
char a[20]
int *ptr = (int *)a;//強制型別轉換並不改變a型別
ptr++; 這個地方的自加運算 位址的改變是 ptr + 4(sizeof(int))
總的來說就是ptr + n就是相當於以ptr為基址之後以n * sizeof()為偏移位址進行定址
指標不能進行相加運算 但是可以進行相減運算 (操作時候必須資料型別相同)
(未完待續......)
指標陣列 陣列指標 函式指標 函式指標陣列
陣列指標 指向陣列的指標,是乙個指標,其指向的型別是陣列 指標陣列 元素為指標的陣列,是乙個陣列,其中的元素為指標。例如 int a 5 這個是陣列指標。int a 5 這個是指標陣列。定義函式指標型別 int max int,int typedef int fun ptr int,int 申明變數...
指標陣列,陣列指標,指標函式,函式指標
int p 4 指標陣列。是個有4個元素的陣列,每個元素的是指向整型的指標。int p 4 陣列指標。它是乙個指標,指向有4個整型元素的陣列。int func void 指標函式。無參函式,返回整型指標。int func void 表示函式指標,可以指向無參,且返回值為整型指標的函式。右左規則 因為...
陣列指標,指標陣列,函式指標,指標函式
陣列指標,指標陣列,函式指標,指標函式 指標 變數,存放變數的位址。例 int ptr,ptr是乙個指向整形變數的指標 陣列 例 int a 10 定義了乙個具有10個元素的一維陣列,其中陣列的每個元素是乙個int型別。陣列指標 陣列首元素位址的指標,即是指向陣列的指標。例 int ptr 10 c...