指针数组和数组指针区别

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 }

原文地址:https://www.cnblogs.com/dpf-learn/p/6108535.html