• 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)、只想使用指针传递数据的快捷,不想数据被无意修改,可以使用常量指针

  • 相关阅读:
    [MacOS]Sublime text3 安装(一)
    [RHEL8]开启BBR
    PAT Advanced 1136 A Delayed Palindrome (20分)
    PAT Advanced 1144 The Missing Number (20分)
    PAT Advanced 1041 Be Unique (20分)
    PAT Advanced 1025 PAT Ranking (25分)
    PAT Advanced 1022 Digital Library (30分)
    PAT Advanced 1019 General Palindromic Number (20分)
    PAT Advanced 1011 World Cup Betting (20分)
    PAT Advanced 1102 Invert a Binary Tree (25分)
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/6960837.html
Copyright © 2020-2023  润新知