C语言学习之指针
指針學習筆記
指針是一個特殊的變量,它里面存儲的數值被解釋成內存里的一個地址
從下方面四個方面入手(索要資料:974488891):
1.????? 指針的類型
2.????? 指針所指向的類型
3.????? 指針的值的值或者叫指針所指向的內存區
4.????? 指針本身所占據的內存區
Example:
int *ptr;
char *ptr;
int **ptr;
int (*ptr)[3];
int *(*ptr)[4]
?
一.指針類型
int *ptr;? ??//其類型是int *;
?????????? ?char *ptr; ???//指針類型char *
????????? ??int **ptr; ???//指針類型int **,二級指針
????????? ??int(*ptr)[3];? ?//指針類型時int (*)[3]
????????? ??int*(*ptr)[4];? //指針類型int *(*)[4]
二.指針所指向的類型
當我們通過指針來訪問指針所指向的內存區時,指針所指向的類型決定了編譯器將吧計算器那塊區域里的內容當做什么來看待,從語法上來看,只需把指針聲明語句中的指針名字和名字左邊的指針聲明符號*去掉,剩下的就是指針所指向的類型.
?
int *ptr;???? //指針所指向的類型為int
char *ptr;??? //指向的類型為char
int **ptr;??? //指針指向的類型時int*,二級指針
int (*ptr)[3];? //指針指向的類型是int ()[3]
int *(*ptr)[4]; //指針指向的類型是int *()[4]
?
1.指針類型剖析:
int p;????????? //普通的整型變量
int *p;???????? //普通的整形指針變量
int p[3];??????? //普通的p先結合數組再結合int型,整形數據類型數組
int *p[3];?????? //p先結合[],優先級[]高于*,所以p是一個數組,再與*結合,所以數組里面的數據類型是指針類型,返回整型數據的指針所組成的數組
int (*)p[5];???? //從變量名開始先結合*,再結合[],故指針所指向的內容是一個數組,然后和int 結合,數組里面元素是整形的,所以p是一個指?? 向整形數據 組 成的數組的指針
int ?**p;???????//指針指向的元素是指針,二級指針
int ?p(int);??????//p是一個函數
int? (*p)(int);????//首先p是一個指針,再與(int)結合,所以P是一個指向有一個整形參數且返回類型為整形的函數的指針
int? *(*p(int))[5];? //從p開始,線與()結合,所以p是一個函數,(*p(int))函數返回的是一個指針,再結合[5],說明返回的指針是指向的一個數組,再與*結合,數組元素是指針;
2.指針類型轉換
? 當初始化一個指針或指針賦值時候,賦值號左右兩邊類型不一致的情況下,此時需要進行強制類型轉化
??? 語法:(TYPE*)P;
?
?
三.指針數組和數組指針
指針數組:用于存儲指針的數組,也就是數組元素都是指針。
數組指針:指向數組的指針。
?
int? *a[10];??????//指針數組,首先a是一個數組,包含10個元素,每個元素都是指針,表示數組a中的元素都為int型指針。
元素表示:*a[i] *(a[i])是一樣的,注意優先級的問題
?
int (*a)[10];??????? //數組指針,表示指向數組a的指針,但是其元素表示(*a)[i],在實際應用對于指針數組,都會經常這樣使用。
Typedef int * pInt; //自定義數據類型,
pInt a[10];?????????
?
四.函數指針和指針函數
函數指針:首先是一個指針,只是這個指針指向的是一個函數
指針變量可以指向變量的地址、數組、字符串、動態分配地址,同時也可以指向一個函數,每個函數在編譯的時候,系統會分配給該函數一個入口地址,函數名表示這個入口,那么指向指針變量稱為函數指針變量
聲明格式:
類型說明符 (*函數名)(參數),準確的說這里不能叫函數名,應該叫做指針變量
Void (*fptr)();
賦值:fptr = &function;取地址運算符不是必須的,因為函數名就表示地址
fptr = function;
如果是函數調用,就必須包括()
兩種方式通過指針調用函數
X =(*fptr)();
X = fptr();
?
?
指針函數:首先是一個函數,只不過這個函數的返回值是一個地址的值,但函數返回值必須使用同類型的指針變量來接受,也就是說,指針函數一定有函數返回值,而且在主調函數中,函數返回值必須給同類型的指針變量。
?
聲明格式: *函數名(參數)
?
?
Float *fun();
Float? *p;
?P = fun(a);
?
?
// PSProject.cpp : 定義控制臺應用程序的入口點。 //#include "stdafx.h" #include <iostream> #include <stdlib.h> #include <stdio.h>using namespace std;void (*funcp)();//函數指針 void FileFunc(),EditFunc();int *GetData(int week,int day);int _tmain(int argc, _TCHAR* argv[]) {int arr[4] = {10,20,30,40};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<<"result1 = "<<*a[1]<<endl;cout <<"result2 = "<<(*b)[2]<<endl;//區分函數指針和指針函數cout <<"函數指針"<<endl;funcp = FileFunc;//只是把函數地址賦給func這個指針(*funcp)(); //這樣才能輸出funcp = EditFunc;(*funcp)(); //這樣才能輸出//指針函數int wk,dy;do {printf("請輸入周(1-5)天(1-7):\n");scanf("%d,%d",&wk,&dy);} while (wk < 1 ||wk > 5|| dy <1 || dy >7);printf("%d\n",*GetData(wk,dy));system("pause");return 0; }void FileFunc() {printf("FileFunc\n"); } void EditFunc() {printf("EditFunc\n"); }int *GetData(int week,int day) {static int calendar[5][7]={{1,2,3,4,5,6,7},{8,9,10,11,12,13,14},{15,16,17,18,19,20,21},{22,23,24,25,26,27,28},{29,30,31,-1}};return &calendar[week-1][day-1]; }?
?
?
?
?
總結
- 上一篇: 相位解包裹
- 下一篇: 关于word中公式和图片对齐的简易设置