1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 6 //指针数组的传参;相当于普通的一维数组。 7 void print_fun011(char **str, int n) 8 { 9 for (int i = 0; i < n; i++) 10 printf("%s, ", *(str + i)); 11 printf(" "); 12 } 13 14 void sort_fun011(char **str, int n) 15 { 16 //冒泡排序 17 for (int i = 0; i < n - 1; i++) 18 { 19 char *tmp; 20 for (int j = 0; j < n - 1 - i; j++) 21 { 22 if (strcmp(*(str + j), *(str + j + 1))) 23 { 24 tmp = *(str + j + 1); 25 *(str + j + 1) = *(str + j); 26 *(str + j) = tmp; 27 } 28 } 29 } 30 } 31 //数组指针:一个特殊的指针(步长特殊),指向一个数组。 32 void print_fun012(char(*p)[10]) 33 { 34 for (int i = 0; i < 3; i++) 35 printf("%s, ", *(p + i)); 36 printf(" "); 37 } 38 39 void sort_fun012(char(*p)[10], int n) 40 { 41 char tmp[10]; 42 //选择排序 43 for (int i = 0; i < n ; i++) 44 { 45 for (int j = i + 1; j < n; j++) 46 { 47 if (strcmp(*(p + i), *(p + j))> 0) 48 { 49 strcpy(tmp, *(p + i)); 50 strcpy(*(p + i), *(p + j)); 51 strcpy(*(p + j), tmp); 52 } 53 } 54 } 55 } 56 int main(void) 57 { 58 //普通一维数组;数据类型是char [10]:(表示数组有10个元素,每个元素都是char型) 59 char a[10]; 60 char *e = NULL; //e是一个一级指针,用来接收普通的一维数组 61 e = a; //e每次"+1",跳过一个(char 类型),即一个字节 62 printf("e: %d, e+1: %d ", e, e + 1); 63 64 //指针数组相当于普通的一维数组,不过数据类型是 char *[5]:(表示数组有5个元素,每个元素都是char 型的指针); 65 char *str[5] = { "sdada", "saadq", "wqeqwe", "12sda", "wq32r" }; 66 char **w = NULL; //w是一个二级指针,接收指针数组。 67 w = str; //w 每次 "+1" 跳过1个(char *类型),即四个字节(32bit平台)。 68 printf("w: %d, w+1: %d ", w, w + 1); 69 70 printf("排序前"); 71 print_fun011(str, 5); 72 printf("排序后"); 73 sort_fun011(str, 5); //数组内容重新排序(两个有本质区别,这个只是地址交换) 74 print_fun011(str, 5); 75 76 77 //数组指针:一个指向数组的指针,(这个指针带有特殊的步长)。 78 //char str1[3][10] = { "asdqw", "123124", "xvzxc" }; 79 char buf2[][10] = { "111111", "3333333", "222222" }; 80 char(*q)[10] = NULL; //q是一个指针,每次 "+1" 跳10个字节(即10个char 元素)的指针。 81 //q= str1; 82 //printf("q: %d, q+1: %d ", q, q + 1); 83 84 printf("排序前"); 85 print_fun012(buf2); 86 printf("排序后"); 87 sort_fun012(buf2, 3); //数组内容重新排序(这个是二维数组,行地址不能直接交换,因为它的拥有内存,是一个一维数组 88 //单纯的地址交换,将使一维数组的首地址丢失。 89 printf("排序后"); 90 print_fun012(buf2); 91 92 93 94 printf(" "); 95 system("pause"); 96 return 0; 97 }
自己总结的:
1 五.指针数组和数组指针 2 1.指针数组 char *p[3];每个元素都是指针 3 int main(void) 4 { 5 char *p1 = "sadqwdq"; 6 char *p2 = "wqdcd"; 7 char *p3 = "32131"; 8 9 char *p[3] = {"sadqwdq","wqdcd","32131"}; 10 11 //即这个指针数组可以和上面的指针有这样的对应关系 12 13 p[1] = p1; //因为数组p的每个元素都是指针,所以可以和普通指针进行等价赋值操作。 14 *(p+2) = p2; 15 *(p+3) = p3; 16 17 "注意下面这种状况,是错误的" 18 scanf("%s",p[1]); 19 scanf("%s",p+1); 20 strcpy(p[1],"sadqw"); 21 strcpy(p+1,"sada"); 22 "原因:因为不管是 p[1] 还是 p+1 都是以个指针,而且是无内存空间,所以不可以往里面写内容。" 23 } 24 2.数组指针:是一个指针,指向一个数组 25 int main(void) 26 { 27 char (*p)[10]; 28 char str[3][10] = {"sadwq","casas","1323"}; 29 p = str; "此时p指向数组的第一行首地址,此时指针具有内存(含一个一维数组,10个char型)" 30 printf("%s",p+1); "此时 p+1 是一个指针,指向数组 str 的第二行首地址,而且它具有内存,是10个char型大小,可以进行写入操作" 31 strcpy("%s",p+1); "p+1 的内容就会被改变" 32 33 "但是它不能进行下述操作" 34 p+1 = "srqweq"; 因为 "srqweq" 是一个常量区字符串,写在等号右边意思是把字符串的首地址赋给它。 35 因为 1.指针 p 每次 +1 会跳10个char型,即10个字节。 而常量字符串的指针,是普通字符指针,每次 +1 只会跳 4 会跳10个char型,即10个字节。 36 步长不一样,编译器会报错。不能进行赋值。 37 2."更重要的是:此时p+1指向二维数组第二行的首地址(含一个一维数组),单纯的地址交换,将使数组的一维数组首地址丢失" 38 39 40 }