zoukankan      html  css  js  c++  java
  • 指针数组和数组指针的区别

     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 }
  • 相关阅读:
    Caused by: java.lang.IllegalArgumentException: Not an managed type: class XXX
    SpringBoot配置文件详细解析
    解决eclipse环境下maven项目tomcat启动,未加载到项目的问题
    CSS+元素,鼠标事件触发鼠标模形变成手状的形状
    LeetCode-Wildcard Matching
    LeetCode-NQueensII
    LeetCode-Climbing Stairs
    LeetCode-Word Search
    LeetCode-Minimum Window Substring
    LeetCode-Largest Rectangle in Histogram
  • 原文地址:https://www.cnblogs.com/yyx1-1/p/5679690.html
Copyright © 2011-2022 走看看