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


     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 }
  • 相关阅读:
    HBase with MapReduce (MultiTable Read)
    HBase with MapReduce (SummaryToFile)
    HBase with MapReduce (Summary)
    HBase with MapReduce (Read and Write)
    HBase with MapReduce (Only Read)
    Hbase中的BloomFilter(布隆过滤器)
    HBase的快照技术
    How To Use Hbase Bulk Loading
    Cloudera-Manager修改集群的IP
    Java中的HashSet和TreeSet
  • 原文地址:https://www.cnblogs.com/yyx1-1/p/5679690.html
Copyright © 2020-2023  润新知