c:对指针数组、数组指针、char数组、char指针的探究(费头发)
一、指针数组
1、指针数组: “指针数组”是“数组”;它是存储指针的数组。
2、指针数组的定义:
2.1、TYPE *pointer_array[SIZE]
2.2、" TYPE "是数据类型;" SIZE "是正整数。
2.3、涵义:pointer_array存储"SIZE"个指针,“SIZE”个指针是"TYPE类型的指针"。
3、int *int_pta[10]:int_pta是存储10个指针的数组,这10个指针的是“int类型的指针”。
4、代码示例:
1 [root@rocky c]# cat pointer_array.c
2 #include<stdio.h>
3 #include<stdlib.h>
4
5
6
7
8 #define SIZEX 5
9 #define SIZEY 3
10
11
12
13
14 // array; array of pointers
15 void array_of_pointers()
16 {
17
18 // num2[3][5]
19 int num2[SIZEY][SIZEX] = {
20 {0,1,2,3,4},
21 {5, 6,7,8,9},
22 {10,11,12,13,14}
23 };
24
25 // array of pointers pointer_array[3][5]
26 int *pointer_array[SIZEY][SIZEX] ;
27
28 // initial pointer_array
29 for(int i=0; i<SIZEY; i++)
30 {
31 for(int j=0; j< SIZEX; j++)
32 {
33 pointer_array[i][j] = &num2[i][j];
34 }
35 }
36
37 printf("\n");
38 printf("---- array_of_pointers ----\n");
39 // output pointer_array
40 for(int i=0;i<SIZEY; i++)
41 {
42 for(int j=0; j< SIZEX; j++)
43 {
44 printf("\tpointer_array[%d][%d] = %d,\tnum2[%d][%d] = %d\n", i,j,*pointer_array[i][j],i,j, num2[i][j]);
45 }
46 }
47 printf("---- array_of_pointers ----\n");
48 printf("\n");
49 }
二、数组指针:
1、数组指针: “数组指针”是“指针”;它是指向数组的指针。
2、数组指针的定义:
2.1、TYPE (*pointer_array)[SIZE]
2.2、" TYPE "是数据类型;" SIZE1,SIZE2,SIZE3,...,SIZEN "是正整数。
2.3、" pointer_array "是指向"SIZE"个元素的数组的指针;pointer_array通常指向二维数组array2,这个二维数组通常定义为" array2[][SIZE] "。
2.4、步进: 即”pointer_array + 1“ 要一次性跨越" SIZE "个数组元素。" pointer_array + 1":通常指向”下一行“元素。
2.5、指向“0维”数组的指针:
2.5.1、定义数组: type array0[0];数组的维数Ds,0维数组的维数:array0_Ds=0;
2.5.1.1、数组元素:array0[d0];数组名是“array0”,“数组名”是地址常量,它代表固定的内存地址;
2.5.1.2、d0: d0=0;
2.5.1.3、将“0维”数组当成“N维”数组:array0[SIZEN=d0]...[0][0][0];
2.5.2、定义数组的指针和初始化: type (*pt0)[0]=array0;
2.5.3、指针的说明:
2.5.3.1、“0维”数组的指针pt0,pt0指向type类型的元素;即“pt0就是指向type类型的普通变量”;
2.5.4、获取指针的地址:若 pt0 = array0;则地址为:pt0;(地址等价,pt0 == &array0);
2.5.5、获取指针的数值:若 pt0 =array0;则数值为:*pt0;(数值等价,*pt0 == array0 );
2.6、指向”一维“数组的指针:
2.6.1、定义数组: type array1[SIZE1];数组的维数Ds,一维数组的维数:array1_Ds=1;
2.6.1.1、数组元素:array1[d1];数组名是“array1”;“数组名”是地址常量,它代表固定的内存地址;
2.6.1.2、d1: 0 <= d1 < SIZE1;
2.6.1.3、将“一维”数组当成“N维”数组:array1[SIZEN=d1][SIZE(N-1)=d0]...[0][0][0];
2.6.2、定义数组指针和初始化:type (*pt)[0]=array1;
2.6.3、指针的说明:pt1指向type类型的元素;
2.6.4、获取地址:
2.6.4.1、地址偏移的角度[ base+offset ]:若 “pt1 = array1”;则地址为:(pt1+d1);(地址等价,(pt1+d1) == &array1[d1]);
2.6.4.2、指针变量的角度[ pt = pt+offset ]:若 “pt1 = pt1 + d1”;则地址为: pt1;(地址等价,pt1 == &array1[d1] );
2.6.5、获取数值:
2.6.5.1、地址偏移的角度[ base+offset ]:若 “pt1 = array1”;则数值为:*(pt1+d1);(数值等价, *(pt1 + d1) == array1[d1] );
2.6.5.2、指针变量的角度[ pt = pt+offset ]:若 “pt1 =array1;pt1 = pt1 + d1”;则数值为:*pt1;(数值等价,*pt1 == array1[d1] ) ;
2.7、指向”二维“数组的指针:
2.7.1、定义数组: type array2[SIZE2][SIZE1];数组的维数Ds,二维数组的维数:array2_Ds=2;
2.7.1.1、数组元素:array2[d2][d1];数组名是“array2”;“数组名”是地址常量,它代表固定的内存地址;
2.7.1.1.1、d1: 0 <= d1 < SIZE1;
2.7.1.1.2、d2: 0 <= d2 < SIZE2;
2.7.1.2、将“二维”数组当成“N维”数组:array2[SIZEN=d2][SIZE(N-1)=d1][SIZE(N-2)=d0]...[0][0][0];
2.7.2、定义数组指针:type (*pt2)[SIZE1]=array2;
2.7.3、指针的说明:
2.7.3.1、理解数组指针的定义:
2.7.3.1.1、pt2将“array2”当作“二维”数组:array2[ROW][COLUMN]
2.7.3.1.1.1、第一部分,ROW=d2 ;
2.7.3.1.1.2、第二部分,COLUMN=d1 ;
2.7.3.2、pt2指向:pt2指向array2[ROW],即pt2指向array2每行的首地址;即(地址相等)pt2[d2] == array2[d2];
2.7.3.3、pt2的步进(地址比较):
2.7.3.3.1、type (*pt2)[SIZE1],其中“SIZE1”定义了pt2的步进,即(pt2+1)要跳过元素的数量。
2.7.3.3.2、pt2步进的解释: 因为array2[COLUMN]有“SIZE1”个元素,故(pt2+1)直接跳到下一行的行首元素地址;
2.7.3.3.3、若“ pt2 = array2 ”;则“ pt2 = pt2+d2 ”;(地址等价,(pt2+d2)==array2[d2] )。
2.7.4、获取地址:
2.7.4.1、地址偏移的角度[ base+offset ]:若 “pt2 = array2”;则地址为:(pt2+d2);(地址等价,(pt2+d2) == array2[d2]);
2.7.4.2、指针变量的角度[ pt = pt+offset ]:若 “pt2=array2;pt2 = pt2 + d2”;则地址为: pt2;(地址等价,pt2 == array2[d2] );
2.7.5、获取数值:
2.7.5.1、地址偏移的角度[ base+offset ]:若 “pt2 = array2”;则数值为:*(pt2+d2);(数值等价, *(pt2 + d2) == array2[d2][0] );
2.7.5.2、指针变量的角度[ pt = pt+offset ]:若 “pt2 =array2;pt2 = pt2 + d2”;则数值为:*pt2;(数值等价,*pt2 == array2[d2][0] ) ;
2.8、指向”三维“数组的指针:
2.8.1、定义数组: type array3[SIZE3][SIZE2][SIZE1];数组的维数Ds,三维数组的维数:array3_Ds=3;
2.8.1.1、数组元素:array3[d3][d2][d1];数组名是“array3”;“数组名”是地址常量,它代表固定的内存地址;
2.8.1.1.1、d1: 0 <= d1 < SIZE1;
2.8.1.1.2、d2: 0 <= d2 < SIZE2;
2.8.1.1.3、d3: 0 <= d3 < SIZE3;
2.8.1.2、将“三维”数组当成“N维”数组:array3[SIZEN=d3][SIZE(N-1)=d2][SIZE(N-2)=d1][SIZE(N-3)=d0]...[0][0][0];
2.8.2、定义数组指针:type (*pt3)[SIZE2][SIZE1]=array3;
2.8.3、指针的说明:
2.8.3.1、理解数组指针的定义:
2.8.3.1.1、pt3将“array3”当作“二维”数组:array3[ROW][COLUMN]
2.8.3.1.1.1、第一部分,ROW=d3 ;
2.8.3.1.1.2、第二部分,COLUMN=d2,d1 ;
2.8.3.2、pt3指向:pt3指向array3[ROW],即pt3指向array3每行的首地址;即(地址相等)pt3[d3] == array3[d3];
2.8.3.3、pt3的步进(地址):
2.8.3.3.1、type (*pt3)[SIZE2][SIZE1],其中“(SIZE2 * SIZE1)”定义了pt3的步进,即(pt3+1)要跳过元素的数量。
2.8.3.3.2、pt3步进的解释: 因为array3[COLUMN]有“(SIZE2 * SIZE1)”个元素,故(pt3+1)直接跳到下一行的行首元素地址;
2.8.3.3.3、若“ pt3 = array3 ”;则“ pt3 = pt3 + array3 ”;则地址为 pt3; (地址等价,pt3 == array3[d3])。
2.8.4、获取地址:
2.8.4.1、地址偏移的角度[ base+offset ]:若 “pt3 = array3”;则地址为:(pt3+d3);(地址等价,(pt3+d3) == array3[d3]);
2.8.4.2、指针变量的角度[ pt = pt+offset ]:若 “pt3=array3;pt3 = pt3 + d3”;则地址为: pt3;(地址等价,pt3 == array3[d3] );
2.8.5、获取数值:
2.8.5.1、地址偏移的角度[ base+offset ]:若 “pt3 = array3”;则数值为:*(pt3+d3);(数值等价, *(pt3 + d3) == array3[d3][0][0] );
2.8.5.2、指针变量的角度[ pt = pt+offset ]:若 “pt3 =array3;pt3 = pt3 + d3”;则数值为:*pt3;(数值等价,*pt3 == array3[d3][0][0] ) ;
2.9、指向”n维“数组的指针:
2.9.1、定义数组: type arrayN[SIZEN]...[SIZE3][SIZE2][SIZE1];数组的维数Ds,三维数组的维数:arrayN_Ds=N;
2.9.1.1、数组元素:arrayN[dn]...[d3][d2][d1];数组名是“arrayN”;“数组名”是常量,它代表固定的内存地址;
2.9.1.1.1、d1: 0 <= d1 < SIZE1;
2.9.1.1.2、d2: 0 <= d2 < SIZE2;
2.9.1.1.3、d3: 0 <= d3 < SIZE3;
. .
. .
. .
2.9.1.1.n、dn: 0 <= dn < SIZEN;
2.9.1.2、将“N维”数组当成“N维”数组:arrayN[SIZEN=dn]...[SIZE3=d3][SIZE2=d2][SIZE1=d1];
2.9.2、定义数组指针:type (*ptN)[SIZE(N-1)]...[SIZE2][SIZE1]=arrayN;
2.9.3、指针的说明:
2.9.3.1、理解数组指针的定义:
2.9.3.1.1、ptN将“arrayN”当作“二维”数组:arrayN[ROW][COLUMN]
2.9.3.1.1.1、第一部分,ROW=dn ;
2.9.3.1.1.2、第二部分,COLUMN=d(n-1), ..., d2,d1 ;
2.9.3.2、ptN指向:ptN指向arrayN[ROW],即ptN指向arrayN每行的首地址;即(地址相等)ptN[dn] == arrayN[dn](ptN[dn] == arrayN[dn]...[0][0][0]);
2.9.3.3、ptN的步进(地址):
2.9.3.3.1、type (*ptN)[arrayN_Ds-1]...[SIZE2][SIZE1],其中“(SIZE[arrayN_DS-1]*...*SIZE2 * SIZE1)”定义了ptN的步进,即(ptN+1)要跳过元素的数量。
2.9.3.3.2、ptN步进的解释: 因为arrayN[COLUMN]有“(SIZE[arrayN_DS-1]*...*SIZE2 * SIZE1)”个元素,故(ptN+1)直接跳到下一行的行首元素地址;
2.9.3.3.3、若“ptN=arrayN;ptN = ptN + dn”;则地址为:ptN (地址等价,ptN == arrayN[dn]))。
2.9.4、获取地址:
2.9.4.1、地址偏移的角度[ base+offset ]:若 “ptN = arrayN”;则地址为:(ptN+dn);(地址等价,(ptN+dn) == arrayN[dn]);
2.9.4.2、指针变量的角度[ pt = pt+offset ]:若 “ptN=arrayN;ptN = ptN + dn”;则地址为: ptN;(地址等价,ptN == arrayN[dn] );
2.9.5、获取数值:
2.9.5.1、地址偏移的角度[ base+offset ]:若 “ptN = arrayN”;则数值为:*(ptN+dn);(数值等价, *(ptN + dn) == arrayN[dn]...[0][0] );
2.9.5.2、指针变量的角度[ pt = pt+offset ]:若 “ptN =arrayN;ptN = ptN + dn”;则数值为:*ptN;(数值等价,*ptN == arrayN[dn]...[0][0] ) ;
3、代码示例:
1 [root@rocky c]# cat pointer_array.c
2 #include<stdio.h>
3 #include<stdlib.h>
4
5
6
7
8 #define SIZEX 5
9 #define SIZEY 3
10
11
12
13
14 // pointer; pointer to array
15 void pointer_of_arrays()
16 {
17
18 // num2[3][5]
19 int num2[SIZEY][SIZEX] = {
20 {0,1,2,3,4},
21 {5, 6,7,8,9},
22 {10,11,12,13,14}
23 };
24
25 // pointer of arrays
26 int (*poa)[SIZEX] ;
27 // initial pointer_array
28 poa=num2;
29
30 printf("\n");
31 printf("---- pointer_of_arrays ----\n");
32 // output pointer_array
33 for(int i=0;i<SIZEY; i++)
34 {
35 printf("=1=*(*(poa+%d))= %d,\tnum2[%d][0] = %d\n", i,*(*(poa+i)), i, num2[i][0]);
36 for(int j=0; j< SIZEX; j++)
37 {
38 printf("\t=2=*(*(poa+%d)+%d)= %d,\tnum2[%d][%d] = %d\n", i,j,*(*(poa+i)+j), i,j, num2[i][j]);
39 }
40 }
41
42 printf("\n");
43 }
三、char数组:
1、char数组定义:
1.1、char string[10]:定义了存储10个“char”的数组;" char string[] "存储一个“字符串”。
1.2、char *pts[10]:定义了10个指针,这些指针指向“char数组(字符串)”;" pts[10] "存储10个“字符串”;
2、char数组:它是真正存储“字符串”的位置。
3、char数组名:
3.1、数组名表示数组在内存中的首地址。
3.2、数组名代表地址常量。数组名不是变量;所以数组名所代表的地址不能被改变,数组名不能被赋值内存地址。
4、char数组和字符串(超级重要):
4.1、用“char”定义字符串数组:
4.1.1、char *string_array[] = {"str0", "str1", "str2"};
4.1.2、定义指向字符串数组的指针并将该指针初始化: char **ptstring = string_array ;
4.2、获取字符串的值:
4.2.1、说明(e,element=string):0 =< e < 3
4.2.2、数组:获取第二个“字符串”: string_array[e=1] ;
4.2.3、指针:获取第二个“字符串”: *( ptstring+1 );
4.2.4、指针:获取第二个“字符串”: ptstring[e=1];
4.3、重要说明:
4.3.1、char 定义变量:
4.3.1.1、字符变量:char c = 'h' ;
4.3.1.2、字符数组:char array_of_chars[5] = {'h', 'e', 'l', 'l', 'o'};
4.3.1.3、字符串数组:char *array_of_strings[] = { "string1", "string2", "string3" }; char **pointer_to_string = array_of_strings ;
4.3.2、char定义指针:
4.3.2.1、char定义“0维”指针:char *pt0 = NULL ;
4.3.2.1.1、“0维”指针的指向说明:“0维”指针pt0,既可以指向单个字符变量( pt0=&c ),又可以指向“一维”char数组( pt0=array_of_chars );
4.3.2.1.1、“0维”指针的输出说明:
4.3.2.1.1.1、pt0输出单个字符: pt0=&c ; printf( "char=%c\n", *pt0 );
4.3.2.1.1.1、pt0输出单个字符串: pt0=array_of_chars ; printf( "char=%s\n", pt0 );
4.4、代码实例
1 [root@rocky c]# cat test_char.c
2 #include<stdio.h>
3 #include<stdlib.h>
4
5
6 // file_name = test_char.c
7
8
9 void msg()
10 {
11 char v1 = 'h';
12 char *pt1 = &v1;
13
14 char va[6] = {'h', 'e', 'l', 'l', 'o'} ;
15 char *pa = va; // va == &va[0];
16
17 char *vs[4] = {"string0", "string1", "string2" };
18 char **ps = vs;
19
20 printf("\nv1_address=%p,\tv1_value=%c\n", pt1, *pt1);
21 printf("\nva_pa_address=%p, \tva_pa_value=%s\t\n", pa, pa);
22 printf("\nvs_ps_address=%p, \tvs_ps_value=%s\t\n", ps[2], ps[2]);
23 }
24
25
26 // testing
27 int main(int argc, char *argv[], char *envp[])
28 {
29
30 msg();
31
32 return 0;
33
34 }
35 [root@rocky c]#
36 [root@rocky c]#
37 [root@rocky c]# ./test_char
38
39 v1_address=0x7ffdf2c819f7, v1_value=h
40
41 va_pa_address=0x7ffdf2c819f1, va_pa_value=hello
42
43 vs_ps_address=0x402020, vs_ps_value=string2
44 [root@rocky c]#
45 [root@rocky c]#
5、代码示例:
1 [root@rocky c]# cat pointer_array.c
2 #include<stdio.h>
3 #include<stdlib.h>
4
5
6
7
8 #define SIZEX 5
9 #define SIZEY 3
10
11
12
13
14 // array, array with chars
15 // fptac = function pointer to array of chars
16 void fptac()
17 {
18
19 // array of chars
20 char ca[SIZEX] = {'h','e','l','l','o' };
21
22 // pointer to array of chars
23 char *pca = ca;
24
25 printf("\n");
26 printf("---- function pointer to array of chars ----\n");
27 for(int i=0; i<SIZEX; i++ )
28 {
29 printf("\tpca+%i=%c,\tca[%d]=%c\n", i, *(pca+i), i, ca[i]);
30 }
31 printf("\n");
32
33 }
四、char 指针
1、char指针的定义
1.1、char *pt: pt指向"char数组"的指针;即 pt指向“字符串”。
1.2、char *str[10](指针数组): str指向10个“字符串”的数组。
1.3、char **pts: pts指向存储“字符串”的数组;pts可以操作“字符串”。
2、char指针:指针仅仅是存储地址的变量。
3、代码示例
1 [root@rocky c]# cat pointer_array.c
2 #include<stdio.h>
3 #include<stdlib.h>
4
5
6
7
8 #define SIZEX 5
9 #define SIZEY 3
10
11
12
13
14 // array, array with strings
15 // fptas = function point to array of strings
16 void fptas()
17 {
18 int size = 5;
19 char *sa[] = { "hello0", "hello1", "hello2", "hello3", "hello4" };
20 char **psa = sa;
21
22 printf("\n");
23 printf("***** fptas() *****\n");
24 for(int i=0; i < size; i++)
25 {
26 printf("\t*(psa+%d)=%s,\tpsa[%d]=%s,\tsa[%d]=%s\n", i, *(psa+i), i, psa[i], i, sa[i]);
27 }
28 printf("***** fptas() *****\n");
29 printf("\n");
30 }
五、完整代码
1 [root@rocky c]# cat pointer_array.c
2 #include<stdio.h>
3 #include<stdlib.h>
4
5
6
7
8 #define SIZEX 5
9 #define SIZEY 3
10
11
12
13
14 // array; array of pointers
15 void array_of_pointers()
16 {
17
18 // num2[3][5]
19 int num2[SIZEY][SIZEX] = {
20 {0,1,2,3,4},
21 {5, 6,7,8,9},
22 {10,11,12,13,14}
23 };
24
25 // array of pointers pointer_array[3][5]
26 int *pointer_array[SIZEY][SIZEX] ;
27
28 // initial pointer_array
29 for(int i=0; i<SIZEY; i++)
30 {
31 for(int j=0; j< SIZEX; j++)
32 {
33 pointer_array[i][j] = &num2[i][j];
34 }
35 }
36
37 printf("\n");
38 printf("---- array_of_pointers ----\n");
39 // output pointer_array
40 for(int i=0;i<SIZEY; i++)
41 {
42 for(int j=0; j< SIZEX; j++)
43 {
44 printf("\tpointer_array[%d][%d] = %d,\tnum2[%d][%d] = %d\n", i,j,*pointer_array[i][j],i,j, num2[i][j]);
45 }
46 }
47 printf("---- array_of_pointers ----\n");
48 printf("\n");
49 }
50
51
52
53
54 // pointer; pointer to array
55 void pointer_of_arrays()
56 {
57
58 // num2[3][5]
59 int num2[SIZEY][SIZEX] = {
60 {0,1,2,3,4},
61 {5, 6,7,8,9},
62 {10,11,12,13,14}
63 };
64
65 // pointer of arrays
66 int (*poa)[SIZEX] ;
67 // initial pointer_array
68 poa=num2;
69
70 printf("\n");
71 printf("---- pointer_of_arrays ----\n");
72 // output pointer_array
73 for(int i=0;i<SIZEY; i++)
74 {
75 printf("=1=*(*(poa+%d))= %d,\tnum2[%d][0] = %d\n", i,*(*(poa+i)), i, num2[i][0]);
76 for(int j=0; j< SIZEX; j++)
77 {
78 printf("\t=2=*(*(poa+%d)+%d)= %d,\tnum2[%d][%d] = %d\n", i,j,*(*(poa+i)+j), i,j, num2[i][j]);
79 }
80 }
81
82 printf("\n");
83 }
84
85
86
87
88 // array, array with chars
89 // fptac = function pointer to array of chars
90 void fptac()
91 {
92
93 // array of chars
94 char ca[SIZEX] = {'h','e','l','l','o' };
95
96 // pointer to array of chars
97 char *pca = ca;
98
99 printf("\n");
100 printf("---- function pointer to array of chars ----\n");
101 for(int i=0; i<SIZEX; i++ )
102 {
103 printf("\tpca+%i=%c,\tca[%d]=%c\n", i, *(pca+i), i, ca[i]);
104 }
105 printf("\n");
106
107 }
108
109
110
111
112 // array, array with strings
113 // fptas = function point to array of strings
114 void fptas()
115 {
116 int size = 5;
117 char *sa[] = { "hello0", "hello1", "hello2", "hello3", "hello4" };
118 char **psa = sa;
119
120 printf("\n");
121 printf("***** fptas() *****\n");
122 for(int i=0; i < size; i++)
123 {
124 printf("\t*(psa+%d)=%s,\tpsa[%d]=%s,\tsa[%d]=%s\n", i, *(psa+i), i, psa[i], i, sa[i]);
125 }
126 printf("***** fptas() *****\n");
127 printf("\n");
128 }
129
130
131
132
133 // testing part
134 int main(int argc, char *argv[], char *envp[])
135 {
136
137 array_of_pointers();
138
139 pointer_of_arrays();
140
141 fptac();
142
143 fptas();
144
145
146 return 0;
147 }
148 [root@rocky c]#
149 [root@rocky c]#
六、运行实例
1 [root@rocky c]# cat pointer_array.c
2 #include<stdio.h>
3 #include<stdlib.h>
4
5
6
7
8 #define SIZEX 5
9 #define SIZEY 3
10
11
12
13
14 // array; array of pointers
15 void array_of_pointers()
16 {
17
18 // num2[3][5]
19 int num2[SIZEY][SIZEX] = {
20 {0,1,2,3,4},
21 {5, 6,7,8,9},
22 {10,11,12,13,14}
23 };
24
25 // array of pointers pointer_array[3][5]
26 int *pointer_array[SIZEY][SIZEX] ;
27
28 // initial pointer_array
29 for(int i=0; i<SIZEY; i++)
30 {
31 for(int j=0; j< SIZEX; j++)
32 {
33 pointer_array[i][j] = &num2[i][j];
34 }
35 }
36
37 printf("\n");
38 printf("---- array_of_pointers ----\n");
39 // output pointer_array
40 for(int i=0;i<SIZEY; i++)
41 {
42 for(int j=0; j< SIZEX; j++)
43 {
44 printf("\tpointer_array[%d][%d] = %d,\tnum2[%d][%d] = %d\n", i,j,*pointer_array[i][j],i,j, num2[i][j]);
45 }
46 }
47 printf("---- array_of_pointers ----\n");
48 printf("\n");
49 }
50
51
52
53
54 // pointer; pointer to array
55 void pointer_of_arrays()
56 {
57
58 // num2[3][5]
59 int num2[SIZEY][SIZEX] = {
60 {0,1,2,3,4},
61 {5, 6,7,8,9},
62 {10,11,12,13,14}
63 };
64
65 // pointer of arrays
66 int (*poa)[SIZEX] ;
67 // initial pointer_array
68 poa=num2;
69
70 printf("\n");
71 printf("---- pointer_of_arrays ----\n");
72 // output pointer_array
73 for(int i=0;i<SIZEY; i++)
74 {
75 printf("=1=*(*(poa+%d))= %d,\tnum2[%d][0] = %d\n", i,*(*(poa+i)), i, num2[i][0]);
76 for(int j=0; j< SIZEX; j++)
77 {
78 printf("\t=2=*(*(poa+%d)+%d)= %d,\tnum2[%d][%d] = %d\n", i,j,*(*(poa+i)+j), i,j, num2[i][j]);
79 }
80 }
81
82 printf("\n");
83 }
84
85
86
87
88 // array, array with chars
89 // fptac = function pointer to array of chars
90 void fptac()
91 {
92
93 // array of chars
94 char ca[SIZEX] = {'h','e','l','l','o' };
95
96 // pointer to array of chars
97 char *pca = ca;
98
99 printf("\n");
100 printf("---- function pointer to array of chars ----\n");
101 for(int i=0; i<SIZEX; i++ )
102 {
103 printf("\tpca+%i=%c,\tca[%d]=%c\n", i, *(pca+i), i, ca[i]);
104 }
105 printf("\n");
106
107 }
108
109
110
111
112 // array, array with strings
113 // fptas = function point to array of strings
114 void fptas()
115 {
116 int size = 5;
117 char *sa[] = { "hello0", "hello1", "hello2", "hello3", "hello4" };
118 char **psa = sa;
119
120 printf("\n");
121 printf("***** fptas() *****\n");
122 for(int i=0; i < size; i++)
123 {
124 printf("\t*(psa+%d)=%s,\tpsa[%d]=%s,\tsa[%d]=%s\n", i, *(psa+i), i, psa[i], i, sa[i]);
125 }
126 printf("***** fptas() *****\n");
127 printf("\n");
128 }
129
130
131
132
133 // testing part
134 int main(int argc, char *argv[], char *envp[])
135 {
136
137 array_of_pointers();
138
139 pointer_of_arrays();
140
141 fptac();
142
143 fptas();
144
145
146 return 0;
147 }
148 [root@rocky c]#
149 [root@rocky c]#
150 [root@rocky c]# ./pointer_array
151
152 ---- array_of_pointers ----
153 pointer_array[0][0] = 0, num2[0][0] = 0
154 pointer_array[0][1] = 1, num2[0][1] = 1
155 pointer_array[0][2] = 2, num2[0][2] = 2
156 pointer_array[0][3] = 3, num2[0][3] = 3
157 pointer_array[0][4] = 4, num2[0][4] = 4
158 pointer_array[1][0] = 5, num2[1][0] = 5
159 pointer_array[1][1] = 6, num2[1][1] = 6
160 pointer_array[1][2] = 7, num2[1][2] = 7
161 pointer_array[1][3] = 8, num2[1][3] = 8
162 pointer_array[1][4] = 9, num2[1][4] = 9
163 pointer_array[2][0] = 10, num2[2][0] = 10
164 pointer_array[2][1] = 11, num2[2][1] = 11
165 pointer_array[2][2] = 12, num2[2][2] = 12
166 pointer_array[2][3] = 13, num2[2][3] = 13
167 pointer_array[2][4] = 14, num2[2][4] = 14
168 ---- array_of_pointers ----
169
170
171 ---- pointer_of_arrays ----
172 =1=*(*(poa+0))= 0, num2[0][0] = 0
173 =2=*(*(poa+0)+0)= 0, num2[0][0] = 0
174 =2=*(*(poa+0)+1)= 1, num2[0][1] = 1
175 =2=*(*(poa+0)+2)= 2, num2[0][2] = 2
176 =2=*(*(poa+0)+3)= 3, num2[0][3] = 3
177 =2=*(*(poa+0)+4)= 4, num2[0][4] = 4
178 =1=*(*(poa+1))= 5, num2[1][0] = 5
179 =2=*(*(poa+1)+0)= 5, num2[1][0] = 5
180 =2=*(*(poa+1)+1)= 6, num2[1][1] = 6
181 =2=*(*(poa+1)+2)= 7, num2[1][2] = 7
182 =2=*(*(poa+1)+3)= 8, num2[1][3] = 8
183 =2=*(*(poa+1)+4)= 9, num2[1][4] = 9
184 =1=*(*(poa+2))= 10, num2[2][0] = 10
185 =2=*(*(poa+2)+0)= 10, num2[2][0] = 10
186 =2=*(*(poa+2)+1)= 11, num2[2][1] = 11
187 =2=*(*(poa+2)+2)= 12, num2[2][2] = 12
188 =2=*(*(poa+2)+3)= 13, num2[2][3] = 13
189 =2=*(*(poa+2)+4)= 14, num2[2][4] = 14
190
191
192 ---- function pointer to array of chars ----
193 pca+0=h, ca[0]=h
194 pca+1=e, ca[1]=e
195 pca+2=l, ca[2]=l
196 pca+3=l, ca[3]=l
197 pca+4=o, ca[4]=o
198
199
200 ***** fptas() *****
201 *(psa+0)=hello0, psa[0]=hello0, sa[0]=hello0
202 *(psa+1)=hello1, psa[1]=hello1, sa[1]=hello1
203 *(psa+2)=hello2, psa[2]=hello2, sa[2]=hello2
204 *(psa+3)=hello3, psa[3]=hello3, sa[3]=hello3
205 *(psa+4)=hello4, psa[4]=hello4, sa[4]=hello4
206 ***** fptas() *****
207
208 [root@rocky c]#
209 [root@rocky c]#
本文由 lnlidawei 原创、整理、转载,本文来自于【博客园】; 整理和转载的文章的版权归属于【原创作者】; 转载或引用时请【保留文章的来源信息】:https://www.cnblogs.com/lnlidawei/p/17009351.html