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