21深入理解C指针之---通过指针传递数据
一、在C程序设计中,主要活动就是操纵数据
1、数据传递:将数据作为参数传入参数和将数据作为数据返回两种
2、函数:
1)、函数类型:主要是指函数返回数据的类型,可以是基本类型或复杂数据类型,即使函数无需返回数据,也需要指定为void类型;
2)、函数名称:使用合适的表达式表明函数自身,便于函数的调用,计算机更多关注的是函数的地址,程序员更多关注的是函数名称;
3)、函数参数:将合适的数据按照固定的顺序和特定的类型传入函数,与函数内的局部变量具有同等地位的变量;
4)、函数作用:完成某种操作或数据修改等任务即可
3、使用指针传递数据:
1)、可以多个函数访问指针对象,快速高效
2)、无需声明为全局变量,可以被多个函数访问
3)、函数访问指针对象时无需复制数组自身,只需要复制数据的地址即可
4)、更加便于函数修改指针指向的数据,而不仅仅是修改数据的副本
5)、只想使用指针传递数据的快捷,不想数据被无意修改,可以使用常量指针
4、代码实例(传入):
1)、可以多个函数访问指针对象,快速高效
#include <stdio.h>
#include <string.h>
#include <stdlib.h> void displayWelcom(char *name){
strcat(name, ", welcom you!"); printf("%s\n", name); return;
} int main(int argc, char **argv)
{
char *name = (char *)malloc(sizeof(char) * );
printf("Please input your name: ");
scanf("%s", name);
printf("Your name is: %s\n", name); printf("------------welcom--------------\n");
displayWelcom(name);
printf("------------welcom--------------\n"); return ;
}
由于函数接受的是个指针,有可能是空指针,若函数自身没有完成内存分配,须有函数调用者完成内存的分配。
2)、更加便于函数修改指针指向的数据,而不仅仅是修改数据的副本
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h> void displayUpper(char *name){
int size = strlen(name);
for (int i = ; i < size; i++){
*(name + i) = toupper(*(name + i));
}
printf("%s\n", name); return;
} int main(int argc, char **argv)
{
char *name = (char *)malloc(sizeof(char) * );
printf("Please input your name: ");
scanf("%s", name);
printf("Your name is: %s\n", name); printf("------------uppername--------------\n");
displayUpper(name);
printf("------------uppername--------------\n"); printf("Your name is: %s\n", name); return ;
}
虽然第21行和第27行的代码是一样的,但是由于调用displayUpper函数实现了name的大些功能,因此,在函数调用前后name的内容是不一样的,运行代码后更加清楚原理。
3)、只想使用指针传递数据的快捷,不想数据被无意修改,可以使用常量指针
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h> void displayWelcom(const char *name){
>> strcat(name, ", welcom you!"); printf("------------welcom--------------\n");
printf("%s\n", name);
printf("------------welcom--------------\n"); return;
} void displayUpper(char *name){
int size = strlen(name);
for (int i = ; i < size; i++){
*(name + i) = toupper(*(name + i));
}
printf("------------uppername--------------\n");
printf("%s\n", name);
printf("------------uppername--------------\n"); return;
} int main(int argc, char **argv)
{
char *name = (char *)malloc(sizeof(char) * );
printf("Please input your name: ");
scanf("%s", name);
printf("Your name is: %s\n", name); displayUpper(name);
displayWelcom(name); printf("Your name is: %s\n", name); return ;
}
第7行代码显示有警告,字符串的特殊处理导致可以出结果,如果使用字符串字节赋值就不能通过编译了。
5、代码实例(传出):
1)、可以多个函数访问指针对象,快速高效
#include <stdio.h>
#include <string.h>
#include <stdlib.h> char* welcom(char *name){
name = (char *)malloc(sizeof(char) * );
printf("-----------in welcom------------\n");
printf("please input your name: ");
scanf("%s", name);
printf("%s\n", name);
strcat(name, ", welcom you!"); printf("%s\n", name);
printf("-----------in welcom------------\n"); return name;
} int main(int argc, char **argv)
{
char *name;
printf("your name: %s\n", welcom(name)); return ;
}
可以完成更加复杂的逻辑交互。
2)、更加便于函数修改指针指向的数据,而不仅仅是修改数据的副本
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h> char* guoUpper(char *name){
name = (char *)malloc(sizeof(char) * );
printf("-----------in guoUpper------------\n");
printf("Please input your name: ");
scanf("%s", name);
printf("Your name is: %s\n", name); int size = strlen(name);
for (int i = ; i < size; i++){
*(name + i) = toupper(*(name + i));
}
printf("%s\n", name);
printf("-----------in guoUpper------------\n"); return name;
} int main(int argc, char **argv)
{
char *name; printf("Your name is: %s\n", guoUpper(name)); return ;
}
简单优雅的完成了数据的修改并返回修改后的数据。
3)、只想使用指针传递数据的快捷,不想数据被无意修改,可以使用常量指针
最新文章
- ExtJS基础知识总结:常用控件使用方式(一)
- php 登录注册api接口代码
- BeautifulSoup-find,findAll
- JUCE 界面库显示中文乱码问题
- linux使用secureCRT连接(没有rsa的时候)
- 谈谈eclipse使用技巧一
- wampserver 2.5安装pear win8.1
- PHP商品秒杀计时实现(解决大流量方案)
- Atitit.词法分析的原理 理论
- 安卓开发_浅谈Service
- Linux查看所有用户用什么命令
- Motan:目录结构
- python第五天
- CSV工具类
- RHEL64 缺少ISO 9660图像 安装程序试图挂载映像#1,在硬盘上无法找到该映像
- videojs双击全屏幕观看,videojs动态加载视频
- [AHOI 2009]chess 中国象棋
- Day6_内置函数
- 【SRM-05 B】无题?
- Win2003打开网页时总是提示添加网址到信任站点的设置方法
热门文章
- DNA Pairing-freecodecamp算法题目
- cppoop作业:Inheritance+Composition 關係下的構造和析構
- CentOS7下systemd
- 一键生成属于自己的QQ历史报告,看看你对自己的QQ了解程度有多深?
- urllib、requests库整理
- python之函数基础总结
- PAT Basic 1079
- 实践自己的WebSite______流水
- Leetcode23--->;Merge K sorted Lists(合并k个排序的单链表)
- P2564 生日礼物