/指針數組
/指針變量指向一個變量的地址 ide
/給指針變量賦的值只能是地址函數
/指針變量的賦值 spa
/{ int a; int *p; p=&a; } or { int a; int *p=&a; } 3d
/指針必須先定義後使用 指針
/不能把一個具體的數賦給指針code
/ &是取地址運算符,&q 表示取變量 q 的地址 blog
/ *是指針運算符,*p 表示返回指定地址內變量的值 內存
/ 所以,p=&q 表示的是地址;scanf 中 &q 表示往該地址寫入操做數;printf 中的 q 表示輸出變量 q 地址中存放的操做數;*p 表示輸出變量 p 指向的地址中存放的操做數字符串
/ &* 和 *& 的區別
/ & * 的運算優先級相同,按自右向左方向結合
/ &* 表示先進行指針運算,再取地址;(&*p=&(*p)=&a)——是一個地址
/ *& 表示先取地址,再進行指針運算;(*&p=*(&p))——是地址中的操做數
/ 指針的自增自減(p++,p--)形成內存地址按照其所指向的數據類型的直接長度的增或減
/ 指針與數組
/ { int a[100],*p; p=a;}
/ p=a表示將數組 a[100] 的首地址賦給指針變量 p,即 p=&a[0]
/ *(p+n)=*(a+n) ,表示數組 a[100] 第n個元素
/ &a[i][j]、(a[i]+j) 表示第 i 行第 j 列的元素"地址"!
/ 指針與字符串
/ { char *str="hello"; printf ("%s",str); }
/ 這裏不是將 hello 賦給指針變量 str ,而是把字符串 "hello" 的首字母地址賦給 str
/ 指針數組
/ { char *str[]={"abc","def","ghi"} }
/ 一個數組,其元素均爲指針類型數據,則稱爲指針數組
/ 因爲字符型數組的長度必須大於最長元素的長度,所以,使用指針數組能夠大大減小這樣的存浪費
/ 指向指針的指針
/ 這種問題只有在實戰當中才能獲得深入理解,實例參見:count_even.c / count_even_2.c / count_even_3.c
1 // 統計數組中偶數的個數 2 3 #include <stdio.h> 4 5 int main() 6 { 7 int a[10], *p, **q, i, n=0; 8 printf ("Please input:"); 9 for (i=0; i<10; i++) 10 scanf ("%d",&a[i]); 11 p=a; 12 q=&p; 13 printf ("The array is :"); 14 for (i=0; i<10; i++) 15 { 16 if (*(*q+i)%2==0) 17 { 18 n++; 19 printf ("%5d",*(*q+i)); 20 } 21 } 22 printf ("\n"); 23 printf ("The number is :%d.\n",n); 24 25 return 0; 26 }
1 // 統計數組元素中偶數的個數(2) 2 3 #include <stdio.h> 4 5 int main() 6 { 7 int a[10], *p, **q, n=0; 8 printf ("Please input:\n"); 9 for (p=a; p-a<10; p++) 10 { 11 q=&p; 12 scanf ("%d",*q); 13 } 14 printf ("The array is:"); 15 for (p=a; p-a<10; p++) 16 { 17 q=&p; 18 if (**q%2==0) 19 { 20 printf ("%5d",**q); 21 n++; 22 } 23 } 24 printf ("\n"); 25 printf ("The number is:%d.\n",n); 26 27 return 0; 28 }
1 // 統計數組元素中的偶數個數(3) 2 3 #include <stdio.h> 4 5 int main() 6 { 7 int a[10], *p, n=0; 8 printf ("Please input:\n"); 9 for (p=a; p-a<10; p++) 10 { 11 scanf ("%d",p); 12 } 13 printf ("The array is:\n"); 14 for (p=a; p-a<10; p++) 15 { 16 if (*p%2==0) 17 { 18 printf ("%5d",*p); 19 n++; 20 } 21 } 22 printf ("\n"); 23 printf ("The number is:%d.",n); 24 25 return 0; 26 }
/ 指針變量做函數參數
/ 實例參見swap.c / swap2.c
1 // 交換兩個數swap.c 2 3 #include <stdio.h> 4 5 // 定義交換函數swap 6 int swap(int *a, int *b); 7 8 // 主函數 9 int main() 10 { 11 int x, y, *p_x, *p_y; 12 printf ("Please input two number:\n"); 13 scanf ("%d,%d", &x, &y); 14 p_x=&x; 15 p_y=&y; 16 swap(p_x, p_y); 17 printf ("x=%d or *p_x=%d", x, *p_x); 18 printf ("y=%d or *p_y=%d", y, *p_y); 19 20 return 0; 21 } 22 23 // 交換函數swap定義區域 24 int swap(int *a, int *b) 25 { 26 int tmp; 27 tmp=*a; 28 *a=*b; 29 *b=tmp; 30 31 return 0; 32 } 33 34 35 // 爲何不能使用以下源程序swap2.c? 36 /* 37 #include <stdio.h> 38 39 int swap(int a, int b); 40 41 int main() 42 { 43 int x, y; 44 printf ("please input two number:\n"); 45 scanf ("%d%d", &x, &y); 46 swap(x,y); 47 printf ("x=%d.\n", x); 48 printf ("y=%d.\n", y); 49 50 return 0; 51 } 52 53 int swap(int a. int b) 54 { 55 int tmp; 56 tmp=a; 57 a=b; 58 b=tmp; 59 } 60 */ 61 // 在函數調用過程當中,主調用函數與被調用函數之間的數值傳遞是單向的,即只能把實參的值傳遞給形參,而不能把形參傳遞給實參。所以,若是使用swap2.c,形參的值會發生改變,但實參的值卻不會發生任何變化。 62 // 而使用指針來傳遞參數,既能夠減小值傳遞帶來的開銷,也能夠使函數調用不產生值傳遞,即只要保證指針指向的地址是正確的便可。
1 // 交換兩個數swap2.c 2 3 #include <stdio.h> 4 5 int swap(int a, int b); 6 7 int main() 8 { 9 int x, y; 10 printf ("please input two number:\n"); 11 scanf ("%d%d", &x, &y); 12 swap(x,y); 13 printf ("x=%d.\n", x); 14 printf ("y=%d.\n", y); 15 16 return 0; 17 } 18 19 int swap(int a. int b) 20 { 21 int tmp; 22 tmp=a; 23 a=b; 24 b=tmp; 25 }
/ 指向函數的指針
/ 指針能夠指向函數,一個函數在編譯時被分配給一個入口地址,這個函數的入口地址就稱爲函數的指針
/ 一個函數能夠返回一個整型值、字符值、實型值等,也能夠返回指針型的數據,即地址
/ 實例見 perimeter.c
1 // 根據指針函數的概念,使用指針函數計算長方形周長 2 3 #include <stdio.h> 4 5 int *per(int a, int b); 6 int perimeter; 7 8 int main() 9 { 10 int width, lenth; 11 int *result; 12 printf ("please input width and lenth:"); 13 scanf ("%d%d", &width, &lenth); 14 result=per(width, lenth); 15 printf ("\nthe perimeter is :%d", *result); 16 17 return 0; 18 } 19 20 int *per(int a, int b) 21 { 22 int *p; 23 p=&perimeter; 24 perimeter=2*(a+b); 25 return p; 26 }
/ 指針數組做 main 函數的參數
/ main 函數能夠是無參函數,也能夠是有參函數
/ main 函數的帶參形式:main(int argc, char *argv[])
/ argc 記錄了命令和參數的個數,指針數組 argv[] 的大小由命令和參數的個數決定
/ 實例見main_pointer.c
1 // main 函數的有參實例 2 3 #include <stdio.h> 4 5 main(int argc, char *argv[]) 6 { 7 printf ("the list of parameter:\n"); 8 printf ("command:\n"); 9 printf ("%s\n",*argv); 10 printf ("the number of parameter:"); 11 printf ("%d",argc); 12 } 13 14 // 運行的結果以下: 15 the list of parameter: 16 command: 17 C:\Administrator\Desktop\jan5\main_parameter.exe 18 the number of parameter:1