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\n", 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\n", name);
19
20     printf("------------welcom--------------\n");
21     displayWelcom(name);
22     printf("------------welcom--------------\n");
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\n", 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\n", name);
22
23     printf("------------uppername--------------\n");
24     displayUpper(name);
25     printf("------------uppername--------------\n");
26
27     printf("Your name is: %s\n", 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--------------\n");
  10     printf("%s\n", name);
  11     printf("------------welcom--------------\n");
  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--------------\n");
  22     printf("%s\n", name);
  23     printf("------------uppername--------------\n");
  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\n", name);
  34
  35     displayUpper(name);
  36     displayWelcom(name);
  37
  38     printf("Your name is: %s\n", 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------------\n");
 8     printf("please input your name: ");
 9     scanf("%s", name);
10     printf("%s\n", name);
11     strcat(name, ", welcom you!");
12
13     printf("%s\n", name);
14     printf("-----------in welcom------------\n");
15
16     return name;
17 }
18
19 int main(int argc, char **argv)
20 {
21     char *name;
22     printf("your name: %s\n", 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------------\n");
 9     printf("Please input your name: ");
10     scanf("%s", name);
11     printf("Your name is: %s\n", 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\n", name);
18     printf("-----------in guoUpper------------\n");
19
20     return name;
21 }
22
23 int main(int argc, char **argv)
24 {
25     char *name;
26
27     printf("Your name is: %s\n", guoUpper(name));
28
29     return 0;
30 }

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

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

posted @ 2017-06-08 06:24  叕叒双又  阅读(835)  评论(0编辑  收藏  举报