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)、只想使用指针传递数据的快捷,不想数据被无意修改,可以使用常量指针
21深入理解C指针之---通过指针传递数据的更多相关文章
- 33深入理解C指针之---通过字符串传递数据
一.传递字符串:在函数的参数列表中,将参数声明为char指针即可实现通过字符串传递参数 1.特征: 1).字符串以char指针的形式传递,一般是const指针传递: 2).使用字符数组声明字符串,调用 ...
- 从IL角度彻底理解回调_委托_指针
从IL角度彻底理解回调_委托_指针 目录 从IL角度彻底理解回调_委托_指针 1.创作此文的背景 1.1.委托能帮助代码更好地封装 1.2.委托能随时随地更方便地运行其他类中的方法 1.3.委托非常适 ...
- 关于C语言的指针数组与指针数组的个人理解
一.指针数组与指针数组 1,指针数组 顾名思义,即一个元素全部是指针的数组,其形式与普通数组相似,形式如 *a[N]. 在理解指针数组的使用方式前,我先来说下我个人对数组的理解. 比如一维整形数组(形 ...
- 深入理解C语言中的指针与数组之指针篇
转载于http://blog.csdn.net/hinyunsin/article/details/6662851 前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...
- 深入理解C语言中的指针与数组之指针篇(转载)
前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...
- 深入理解C指针之五:指针和字符串
原文:深入理解C指针之五:指针和字符串 基础概念 字符串可以分配到内存的不同区域,通常使用指针来支持字符串操作.字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常 ...
- 深入理解C指针之六:指针和结构体
原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...
- 深入理解C指针之四:指针和数组
原文:深入理解C指针之四:指针和数组 数组是C内建的基本数据结构,数组表示法和指针表示法紧密关联.一种常见的错误认识是数组和指针完全可以互换,尽管数组名字有时可以当做指针来用,但数组的名字不是指针.数 ...
- 深入理解C指针之三:指针和函数
原文:深入理解C指针之三:指针和函数 理解函数和指针的结合使用,需要理解程序栈.大部分现代的块结构语言,比如C,都用到了程序栈来支持函数的运行.调用函数时,会创建函数的栈帧并将其推到程序栈上.函数返回 ...
随机推荐
- JavaScript Dom编程艺术(1)
Dom是一种可以供多种环境和多种程序设计语言使用的API: 一份文档就是一个节点树: 节电分为不同的类型:元素节点,属性节点,文档节点,元素节点分为属性节点和文档节点: getelementbyid( ...
- ubuntu 16.04 连接 wifi
我的电脑是win10+ubuntu16.04双系统.在ubuntu下无法连接wifi,一直用usb连接的手机流量,不太方便.现在来用安装无线驱动,顺便翻个墙. https://blog.csdn.ne ...
- 转 消息队列之 RabbitMQ
转 https://www.jianshu.com/p/79ca08116d57 消息队列之 RabbitMQ 预流 2017.05.06 16:03* 字数 4884 阅读 80990评论 18喜欢 ...
- Golang ioutil读写文件测试
运用 ioutil.ReadFile .ioutil.WriteFile package main import ( "io/ioutil" "log" &qu ...
- 标准C++(3)重载
一.函数的重载 c++中同一作用域下能够定义同名的函数(这就叫重载),但必须满足如下要求: 1.函数的参数列表必须不同,可以使参数数量不同,也可以使参数的类型不同,甚至是参数的顺序不同. 2.函数的返 ...
- Markdown中如何添加特殊符号
符号 说明 编码 符号 说明 编码 符号 说明 编码 " 双引号 " × 乘号 × ← 向左箭头 ← & AND符号 & ÷ 除号 ÷ ↑ 向上箭头 ↑ < ...
- linux时区
1. UTC时区切换到CST 时区# echo "export TZ='Asia/Shanghai'" >> /etc/profile # cat /etc/profi ...
- phpstudy2016+phpstorm2017-3+xdebug+chrome
1. 勾选Xdebug 后 phpstudy 会自动重启服务 [XDebug] xdebug.profiler_output_dir="D:\phpStudy\tmp\xdebug" ...
- pycharm-install scipy
懒得装双系统,所以在win7下用pycharm,python2.7 虽然机子本身是64位,但是安装包的时候,我居然需要下载32位的??迷:) 这次装的是scipy.在pycharm里添加不了,根据网上 ...
- Android兼容性测试CTS Verifier-环境搭建、测试执行、结果分析
CTS Verifier算是CTS的一部分,需要手动进行,主要用于测试那些自动测试系统无法测试的功能,比如相机.传感器等.由于硬件配置或其他原因,不同手机上部分测试项目被隐藏,也就是说CTS Veri ...