• 21深入理解C指针之---通过指针传递数据


     一、在C程序设计中,主要活动就是操纵数据

        1、数据传递:将数据作为参数传入参数和将数据作为数据返回两种

        2、函数:

          1)、函数类型:主要是指函数返回数据的类型,可以是基本类型或复杂数据类型,即使函数无需返回数据,也需要指定为void类型;

          2)、函数名称:使用合适的表达式表明函数自身,便于函数的调用,计算机更多关注的是函数的地址,程序员更多关注的是函数名称;

          3)、函数参数:将合适的数据按照固定的顺序和特定的类型传入函数,与函数内的局部变量具有同等地位的变量;

          4)、函数作用:完成某种操作或数据修改等任务即可

        3、使用指针传递数据:

          1)、可以多个函数访问指针对象,快速高效

          2)、无需声明为全局变量,可以被多个函数访问

          3)、函数访问指针对象时无需复制数组自身,只需要复制数据的地址即可 

          4)、更加便于函数修改指针指向的数据,而不仅仅是修改数据的副本 

          5)、只想使用指针传递数据的快捷,不想数据被无意修改,可以使用常量指针      

        4、代码实例(传入):

          1)、可以多个函数访问指针对象,快速高效

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <stdlib.h>
     4
     5 void displayWelcom(char *name){
     6     strcat(name, ", welcom you!");
     7
     8     printf("%s
    ", name);
     9
    10     return;
    11 }
    12
    13 int main(int argc, char **argv)
    14 {
    15     char *name = (char *)malloc(sizeof(char) * 20);
    16     printf("Please input your name: ");
    17     scanf("%s", name);
    18     printf("Your name is: %s
    ", name);
    19
    20     printf("------------welcom--------------
    ");
    21     displayWelcom(name);
    22     printf("------------welcom--------------
    ");
    23
    24     return 0;
    25 }

        由于函数接受的是个指针,有可能是空指针,若函数自身没有完成内存分配,须有函数调用者完成内存的分配。

          2)、更加便于函数修改指针指向的数据,而不仅仅是修改数据的副本

     1 #include <stdio.h>
     2 #include <ctype.h>
     3 #include <string.h>
     4 #include <stdlib.h>
     5
     6 void displayUpper(char *name){
     7     int size = strlen(name);
     8     for (int i = 0; i < size; i++){
     9         *(name + i) = toupper(*(name + i));
    10     }
    11     printf("%s
    ", name);
    12
    13     return;
    14 }
    15
    16 int main(int argc, char **argv)
    17 {
    18     char *name = (char *)malloc(sizeof(char) * 20);
    19     printf("Please input your name: ");
    20     scanf("%s", name);
    21     printf("Your name is: %s
    ", name);
    22
    23     printf("------------uppername--------------
    ");
    24     displayUpper(name);
    25     printf("------------uppername--------------
    ");
    26
    27     printf("Your name is: %s
    ", name);
    28
    29     return 0;
    30 }

        虽然第21行和第27行的代码是一样的,但是由于调用displayUpper函数实现了name的大些功能,因此,在函数调用前后name的内容是不一样的,运行代码后更加清楚原理。

          3)、只想使用指针传递数据的快捷,不想数据被无意修改,可以使用常量指针

       1 #include <stdio.h>
       2 #include <ctype.h>
       3 #include <string.h>
       4 #include <stdlib.h>
       5
       6 void displayWelcom(const char *name){
    >> 7     strcat(name, ", welcom you!");
       8
       9     printf("------------welcom--------------
    ");
      10     printf("%s
    ", name);
      11     printf("------------welcom--------------
    ");
      12
      13     return;
      14 }
      15
      16 void displayUpper(char *name){
      17     int size = strlen(name);
      18     for (int i = 0; i < size; i++){
      19         *(name + i) = toupper(*(name + i));
      20     }
      21     printf("------------uppername--------------
    ");
      22     printf("%s
    ", name);
      23     printf("------------uppername--------------
    ");
      24
      25     return;
      26 }
      27
      28 int main(int argc, char **argv)
      29 {
      30     char *name = (char *)malloc(sizeof(char) * 20);
      31     printf("Please input your name: ");
      32     scanf("%s", name);
      33     printf("Your name is: %s
    ", name);
      34
      35     displayUpper(name);
      36     displayWelcom(name);
      37
      38     printf("Your name is: %s
    ", name);
      39
      40     return 0;
      41 }

        第7行代码显示有警告,字符串的特殊处理导致可以出结果,如果使用字符串字节赋值就不能通过编译了。

        5、代码实例(传出):

          1)、可以多个函数访问指针对象,快速高效

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <stdlib.h>
     4
     5 char* welcom(char *name){
     6     name = (char *)malloc(sizeof(char) * 20);
     7     printf("-----------in welcom------------
    ");
     8     printf("please input your name: ");
     9     scanf("%s", name);
    10     printf("%s
    ", name);
    11     strcat(name, ", welcom you!");
    12
    13     printf("%s
    ", name);
    14     printf("-----------in welcom------------
    ");
    15
    16     return name;
    17 }
    18
    19 int main(int argc, char **argv)
    20 {
    21     char *name;
    22     printf("your name: %s
    ", welcom(name));
    23
    24     return 0;
    25 }

        可以完成更加复杂的逻辑交互。

          2)、更加便于函数修改指针指向的数据,而不仅仅是修改数据的副本

     1 #include <stdio.h>
     2 #include <ctype.h>
     3 #include <string.h>
     4 #include <stdlib.h>
     5
     6 char* guoUpper(char *name){
     7     name = (char *)malloc(sizeof(char) * 20);
     8     printf("-----------in guoUpper------------
    ");
     9     printf("Please input your name: ");
    10     scanf("%s", name);
    11     printf("Your name is: %s
    ", name);
    12
    13     int size = strlen(name);
    14     for (int i = 0; i < size; i++){
    15         *(name + i) = toupper(*(name + i));
    16     }
    17     printf("%s
    ", name);
    18     printf("-----------in guoUpper------------
    ");
    19
    20     return name;
    21 }
    22
    23 int main(int argc, char **argv)
    24 {
    25     char *name;
    26
    27     printf("Your name is: %s
    ", guoUpper(name));
    28
    29     return 0;
    30 }

        简单优雅的完成了数据的修改并返回修改后的数据。

          3)、只想使用指针传递数据的快捷,不想数据被无意修改,可以使用常量指针

  • 相关阅读:
    Cache 在选择的几点思考
    英语12种记忆单词的方法
    对啊英语音标---二、ghywr这些辅音怎么发音
    日常英语---八、REBOOT
    日常英语---一、纸质版还是电子版
    日常英语---四、vis.js是什么
    日常英语---二、注册google的api的key
    日常英语---七、[Updated November 14 at 4:10 PM PST] Scheduled Game Update
    日常英语---六、Maplestory Illium
    日常英语---三、网页查找单词用什么
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/6960837.html
Copyright © 2020-2023  润新知