C_Learning(2)

/指針數組

  /指針變量指向一個變量的地址  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 }
count_even.c

 

 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 }
count_even2.c
 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 }
count_even3.c

  

  / 指針變量做函數參數   

    / 實例參見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 // 而使用指針來傳遞參數,既能夠減小值傳遞帶來的開銷,也能夠使函數調用不產生值傳遞,即只要保證指針指向的地址是正確的便可。
swap.c
 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 }
swap2.c

 

  / 指向函數的指針   

    / 指針能夠指向函數,一個函數在編譯時被分配給一個入口地址,這個函數的入口地址就稱爲函數的指針   

    / 一個函數能夠返回一個整型值、字符值、實型值等,也能夠返回指針型的數據,即地址   

    / 實例見 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 }
perimeter.c

 

  / 指針數組做 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
main_parameter.c
相關文章
相關標籤/搜索