iOS學習(C語言)知識點整理
一、指針
1)概念:存儲變量的地址的一個變量。
2) 數據存儲類型分析
1、text (代碼段) :存儲二進制的可執行代碼
2、data(初始化的數據段) 存儲初始化的全局變量以及初始化的static修飾的變量,分為只讀數據段
(如:字符串常量,整型常量)及可讀可寫數據段,靜態存儲。
3、data(未初始化的數據段)存儲未初始化的全局變量及未初始化的static修飾的變量,靜態存儲。
4、heap(堆區) 內存使用需要手動申請,手動釋放,空間非常大,通常存儲大容量的數據,執行效率比較低
使用比較麻煩,動態存儲。
5、stack(棧區)內存空間比較小,函數調用局部變量開辟都是棧上,使用效率非常高。
3)取地址符 “&”,間接尋址符 “ * ”,“%p” 打印地址的格式字符
4)指針標示符:* 例如: int *p 表示定義了一個指針p,*是指針標示,int表示p指向的類型(里面存儲的是int型變量的地址)
5)各種類型的指針,在內存中擁有的空間都是一樣的,64位系統下面都是8個字節(32位是4個字節)。
6)指針運算 指針對象 ++,表示指向地址向后偏移,偏移量為sizeof(指向的類型);- -則表示向前偏移。
7)野指針:未初始化值的指針,里面是個隨機地址,可以任意修改該地址對應的值,會給系統造成不可控制的影響。
8)空指針 p=NULL=0; 0是非法地址,0地址不可賦值,不可讀寫。
9)指針的優點
1、為函數提供修改調用變量的靈活手段
2、可以使函數有多個返回值
3、可以改善某些子程序的效率 ,在傳遞數據時,如果數據塊較大(比如數據緩沖區域或比較大的結構),這時就可使用指針傳遞地址而
不是實際數據,即可提 高傳輸速度,又節省大量內存。
4、為動態數據結構(如 二叉樹、鏈表)提供支持。
10)void* 指針,通配指針,可是指向任意類型。
11)指針的應用,函數中指針作為函數的入參。
12)int *a; 指針變量,指向int型數據。
13)指針數組 即指向一個數組類型的指針
例如: int *p[4] : 表示4個指向int的指針.每個指針都是獨立的,沒有關系; p[i] 是一個 int 型指針
p[i]=*(p+i)
實例代碼:
1 int add(int *a[],int len1,int len2) 2 { 3 int sum = 0; 4 for(int i=0;i<len1;i++){ 5 //a[i]第i個指針=第i個一維數組 6 for(int j=0;j<len2;j++){ 7 sum = sum + *(a[i]+j); 8 } 9 }10 return sum;11 }12 13 int main()14 {16 int a[4][3]={{1,2,3},{4,5,6}, {7,8,9},{10,11,12}};17 int *p[4];//指針數組,沒初始化不能用,野指針組18 for(int i=0;i<4;i++){19 p[i]=a[i];//a[i]表示第i行的一個數組20 }22 int sum = add(p,4,3);23 PRintf("sum = %d/n",sum);24 return 0;25 }
14)數組指針
實例代碼:
1 int add(int(*p)[3],int len) 2 { 3 int sum = 0; 4 for(int i=0;i<len;i++){ 5 //p+i 表示指向第i個數組 *(p+i)=a[i] 6 for(int j=0;j<3;j++){ 7 //a[i][j] = *(a[i]+j) = *(*(p+i)+j) 8 sum = sum + *(*(p+i)+j); 9 }10 }11 12 return sum;13 }14 15 int main()16 {17 int a[4][3]={{1,2,3},{4,5,6}, {7,8,9},{10,11,12}};19 //a[0],a[1],a[2],a[3]:4個數組都有3個元素21 int(*p)[3];//可以指向一個有3個元素的數組23 //p = &(a[0]);//&a[0] = &(*(a+0))25 p = a;//由上面的那個式子化簡27 int sum =add(a, 4);//既然p=a,就可以這么寫29 printf("sum %d /n",sum);31 }
15)函數指針 int (*pfunc)(int,int); 定義了一個函數指針,必須要指向 int XXX(int a,int b) 這種樣式的函數
實例代碼:
1 int add(int a,int b) 2 { 3 return a+b; 4 } 5 6 int main(){ 7 int a = 10; 8 int b = 20; 9 int sum;10 int (*pfunc)(int,int);11 12 pfunc = add;//函數名相當于一個指向其函數入口指針常量14 sum = pfunc(a,b);16 printf("sum = %d/n",sum);18 return 0;20 }
16) 使用指針 實現函數回調
實現代碼:
1 void print_hello() 2 { 3 printf("hello world/n"); 4 } 5 6 void print_date() 7 { 8 time_t rawtime;10 struct tm * timeinfo;12 time ( &rawtime );14 //獲取系統本地時間 需要引用 time頭文件 ,#include <time.h>16 timeinfo = localtime ( &rawtime );18 printf ( "%4d-%02d-%02d %02d:%02d:%02d/n",1900+(*timeinfo).tm_year, 1+(*timeinfo).tm_mon,20 (*timeinfo).tm_mday,(*timeinfo).tm_hour,(*timeinfo).tm_min,(*timeinfo).tm_sec);22 }23 24 // void(*pfunc)()25 void print_all(void(*pfunc)(),int count)26 {27 for(int i=0;i<count;i++){28 pfunc();29 }31 }33 34 int main()35 {37 print_all(print_date,4);//循環輸出4次39 print_all(print_hello,1);41 return 0;42 }
17)使用指針實現遞歸算法
實現代碼:
void sort_array(int *a,int len){ //冒泡排序 int temp; for(int i=0;i<len-1;i++){ for(int j=0;j<len-1-i;j++){ if(*(a+j)>*(a+j+1)) { temp = *(a+j); *(a+j) = *(a+j+1); *(a+j+1) = temp; } } }}
int main(){ int a[5]={1,20,30,4,5}; int *p; p = a; //傳遞數組:2種形式 數組或者指針 print_array(a, 5); return 0;}
18)二級指針 指向指針的指針。
實例代碼:
1 void swap(int **p,int **q) 2 { 4 int temp; 6 temp = **p; 8 **p = **q;10 **q = temp;12 }13 15 int main()16 {18 int a = 10;20 int b = 20;22 int *p = &a;//p是一個指針,指向int型24 int **q;//q是一個指針,指向 int *型,int* 型就是指向int的指針類型,p就是這樣一個類型26 q = &p;//*q=*(&p)=p28 printf("%d/n",**q);//*q=p,**q=*p=a30 int *p_b = &b;32 int **pp_b = &p_b;34 swap(q,pp_b);36 printf("a=%d,b=%d/n",a,b);38 return 0;39 }
19)const 修飾符,只讀 表現形式: const 數據類型 變量名 ,const 直接修飾的變量不可以改變,但加了*的變量可修改。
實例代碼:
1 int main() 2 { 4 int value1 = 10; 6 int value2 = 20; 8 const int a = 100;10 printf("a=%d/n",a);12 a = 20;//const修飾的變量不能修改14 const int *p = &value1;16 p = &value2;18 //*p = 100;//*p不可以修改,p可以改20 int const *m = &value1;22 m = &value2;24 //*m = 10;//*m不可以修改,m可以改26 int *const n;//n不可以改,*n可以改28 const int *const q//q不可以改,*q不可以改30 const int *const m,*n;//m,*m不可以改,n可以改32 *n =100;//*n也不可以改34 const int *const m, *const n;//m,*m,n不可以改36 *n = 100;//*n也不可以改38 int *const m, *const n;//m,n不可以改,*m,*n可以改,40 *n = 100;41 }
新聞熱點
疑難解答