码迷,mamicode.com
首页 > 编程语言 > 详细

指针数组和数组指针的区别

时间:2016-07-18 02:37:29      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:

 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("\n");
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("\n");
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 \n", 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 \n", 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 \n", 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("\n");
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 }

 

指针数组和数组指针的区别

标签:

原文地址:http://www.cnblogs.com/yyx1-1/p/5679690.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!