Linux Cプログラムポインタ配列と二次ポインタ(TEN)

25873 ワード

ポインタ配列と2次ポインタ
 1 #include<stdio.h>

 2 

 3 int main(){

 4         int a[5] = {1,3,5,7,9};

 5         int *p[5], i;

 6         int **pp = p;

 7     // p         a

 8         for(i = 0 ; i < 5 ; i++){

 9                 p[i] =&a[i];

10         }

11     //【】     * ,*(p[i]) p[i] = &a[i],so==> *p[i] = *&a[i] = a[i]

12         for(i = 0 ; i < 5 ; i++){

13                 printf("%d ",*p[i]);

14         }

15         printf("
"); 16 //p pp ,i=0 ,*pp=p[0] ,p[0]=&a[i],*pp=a[0]. 17 // pp++ ,pp p[1],*pp=p[1],p[1]=&a[1]. 18 for(i = 0 ; i < 5 ; i++,pp++){ 19 printf("%d ",**pp); 20 } 21 22 return 0 ; 23 } 24 output: 25 1 3 5 7 9 26 1 3 5 7 9

ポインタと配列の関係
 1 nclude<stdio.h>

 2 

 3 int main(){

 4         int a[2][5] = {1,3,5,7,9,2,4,6,8,10};

 5         //  p     ,             

 6         int (*p)[5],i;

 7         //p          

 8         p = a ;

 9     //p=a    , p=&a , *p = a[1].

10     //p       

11         for(i = 0 ; i < 5 ; i++){

12                 printf("%d ",(*p)[i]);

13         //(*p)[i]    p            ,     i   。

14         //*p[i]    p       i   ,      ,         。

15         }

16         printf("
"); 17 //p 18 p++; 19 for(i = 0 ; i < 5 ; i++){ 20 printf("%d ",(*p)[i]); 21 } 22 printf("
"); 23 24 return 0; 25 } 26 27 int (*p)[5] ;// 28 int *p[5] ; // , 5, 。

 
関数とポインタ1.ポインタが関数としてパラメータを得る役割は、変数のアドレスを関数に転送することです.
 1 #include<stdio.h>

 2 void change(int i , int *p){

 3         i++;

 4         if(p != NULL){

 5                 (*p)++;//        b,b+1

 6         }

 7 }

 8 int main(){

 9         int a = 5 , b = 10 ;

10         change(a,&b);

11         printf("a=%d,b=%d",a,b);

12         return 0;

13 }

 
2.戻りポインタ得関数1 int*f(int i,int j);()の優先度が*より高いことはfが関数であり、関数名にポインタがあり、この関数が戻り値タイプがポインタであることを示す.
 1 include<stdio.h>

 2 //       name     ,              

 3 char *name[7] = {"monday","tuesday","wednessday","thursday","friday","saturday","sunday"};

 4 //

 5 char *message = "wrong input";

 6 //       

 7 char *week(int day){

 8         if(day < 0 || day > 7){

 9                 return message ;

10         }else{

11                 return name[day-1] ;

12         }

13 }

14 

15 

16 int main(){

17         int day ;

18         char *p;

19 

20         printf("input a number of a week:
"); 21 scanf("%d",&day); 22 23 p = week(day); 24 printf("%s
",p); 25 26 return 0; 27 }

 
3.関数へのポインタ:
 1 #include<stdio.h>

 2 

 3 #define GET_MAX 0

 4 #define GET_MIN 1

 5 

 6 int get_max(int i , int j){

 7         return i > j ? i : j ;

 8 }

 9 

10 int get_min(int i , int j){

11         return i < j ? i : j ;

12 }

13 

14 int compare(int i , int j , int flag){

15         int ret ;

16         //         

17         int (*p)(int ,int);

18 

19         if(flag == GET_MAX){

20                 p = get_max;//   

21         }else{

22                 p = get_min;

23         }

24 

25         ret  = p(i , j );

26         return ret ;

27 }

28 

29 int main(){

30         int i = 5 , j = 10 , ret ;

31         ret = compare(i , j , GET_MAX);

32         printf("max = %d
",ret); 33 34 ret = compare(i, j , GET_MIN); 35 printf("min = %d
",ret); 36 37 }

関数を指すポインタの演算はできません.
1 int *f(int i , int j);//       

2 int (*p)(int i , int j);//       

4.関数ポインタがパラメトリック関数を行うパラメータはポインタであってもよく、淡々として関数を指すポインタであってもよい
 1 int get_max(int i , int j,int k , (*p)(int ,int)); 
この関数は4つのパラメータを受信し,関数内でポインタで他の関数を呼び出し,信号処理にこの技術を用いる.eg:
 1 #include<stdio.h>

 2 

 3 int get_big(int i , int j){

 4         return i > j ? i : j ;

 5 }

 6 //get_max               

 7 int get_max(int i ,int j ,int k ,int  (*p)(int ,int)){

 8         int ret ;

 9 

10         ret = p(i , j );

11         ret = p(ret , k);

12         return ret ;

13 }

14 

15 int main(){

16         int i = 1 , j = 10 , k = 15 , ret ;

17         ret = get_max(i , j , k , get_big);

18         printf("max = %d",ret);

19         return 0;

20 }

5.関数ポインタを返す関数eg:
 1 #include<stdio.h>

 2 

 3 int get_big(int i , int j){

 4         return i > j ? i : j ;

 5 }

 6 //()     * , get_function  ()  ,      ,                int (*)(int ,int)

 7 int (*get_function(int a))(int ,int ){

 8         printf("the number is %d",a);

 9         return get_big;

10 }

11 

12 int main(){

13         int i =5 , j = 10 , max ;

14         int (*p)(int ,int);

15         p = get_function(100);

16 

17         max = p(i , j );

18         printf("max number is %d",max);

19         return 0;

20 }

配列名は常にその配列の最初の要素を指し、a++演算は許されず、新しく宣言されたポインタは自由に移動することができる.