Linux Cプログラムポインタ配列と二次ポインタ(TEN)
25873 ワード
ポインタ配列と2次ポインタ
ポインタと配列の関係
関数とポインタ1.ポインタが関数としてパラメータを得る役割は、変数のアドレスを関数に転送することです.
2.戻りポインタ得関数1 int*f(int i,int j);()の優先度が*より高いことはfが関数であり、関数名にポインタがあり、この関数が戻り値タイプがポインタであることを示す.
3.関数へのポインタ:
関数を指すポインタの演算はできません.
4.関数ポインタがパラメトリック関数を行うパラメータはポインタであってもよく、淡々として関数を指すポインタであってもよい
1 int get_max(int i , int j,int k , (*p)(int ,int));
この関数は4つのパラメータを受信し,関数内でポインタで他の関数を呼び出し,信号処理にこの技術を用いる.eg:
5.関数ポインタを返す関数eg:
配列名は常にその配列の最初の要素を指し、a++演算は許されず、新しく宣言されたポインタは自由に移動することができる.
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++演算は許されず、新しく宣言されたポインタは自由に移動することができる.