一、在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指针之---通过指针传递数据的更多相关文章

  1. 33深入理解C指针之---通过字符串传递数据

    一.传递字符串:在函数的参数列表中,将参数声明为char指针即可实现通过字符串传递参数 1.特征: 1).字符串以char指针的形式传递,一般是const指针传递: 2).使用字符数组声明字符串,调用 ...

  2. 从IL角度彻底理解回调_委托_指针

    从IL角度彻底理解回调_委托_指针 目录 从IL角度彻底理解回调_委托_指针 1.创作此文的背景 1.1.委托能帮助代码更好地封装 1.2.委托能随时随地更方便地运行其他类中的方法 1.3.委托非常适 ...

  3. 关于C语言的指针数组与指针数组的个人理解

    一.指针数组与指针数组 1,指针数组 顾名思义,即一个元素全部是指针的数组,其形式与普通数组相似,形式如 *a[N]. 在理解指针数组的使用方式前,我先来说下我个人对数组的理解. 比如一维整形数组(形 ...

  4. 深入理解C语言中的指针与数组之指针篇

    转载于http://blog.csdn.net/hinyunsin/article/details/6662851     前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...

  5. 深入理解C语言中的指针与数组之指针篇(转载)

    前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...

  6. 深入理解C指针之五:指针和字符串

    原文:深入理解C指针之五:指针和字符串 基础概念 字符串可以分配到内存的不同区域,通常使用指针来支持字符串操作.字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常 ...

  7. 深入理解C指针之六:指针和结构体

    原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...

  8. 深入理解C指针之四:指针和数组

    原文:深入理解C指针之四:指针和数组 数组是C内建的基本数据结构,数组表示法和指针表示法紧密关联.一种常见的错误认识是数组和指针完全可以互换,尽管数组名字有时可以当做指针来用,但数组的名字不是指针.数 ...

  9. 深入理解C指针之三:指针和函数

    原文:深入理解C指针之三:指针和函数 理解函数和指针的结合使用,需要理解程序栈.大部分现代的块结构语言,比如C,都用到了程序栈来支持函数的运行.调用函数时,会创建函数的栈帧并将其推到程序栈上.函数返回 ...

随机推荐

  1. OC和C++的混用2

    苹果的Objective-C编译器允许用户在同一个源文件里自由地混合使用C++和Objective-C,混编后的语言叫Objective-C++.有了它,你就可以在Objective-C应用程序中使用 ...

  2. cocos2d-x中的字符串操作

    1:循环体中字符串的构造.      通常用于多个有规律的文件的名字,诸如:[NSString stringWithFormat:@"filed.png",i].我们可以通过spr ...

  3. svn提交报错,提示:locked,需要cleanup

    版权声明:本文为博主原创文章,未经博主允许不得转载. 原文地址: https://www.cnblogs.com/poterliu/p/9285137.html 在使用SVN提交代码或更新代码时经常会 ...

  4. 《linux设备驱动开发详解》笔记——10中断与时钟

    10.1 中断与定时器 中断一般有如下类型: 内部中断和外部中断:内部中断来自CPU,例如软件中断指令.溢出.除0错误等:外部中断有外部设备触发 可屏蔽中断和不可屏蔽中断 向量中断和非向量中断,ARM ...

  5. ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph(有源上下界最大流 模板)

    关于有源上下界最大流: https://blog.csdn.net/regina8023/article/details/45815023 #include<cstdio> #includ ...

  6. Git for Windows 工具的使用(二)

    Git分支  当一个人开发功能A而另一个人开发功能B,之后代码进行整合的时候,使代码既有功能A也有功能B.在Git中,Git给了我们分支的概念. 分支可以使用我们快速的开发协作,并且快速的合并. 分支 ...

  7. Linux学习-登录档的轮替(logrotate)

    rsyslogd 利用的是 daemon 的方式来启动的, 当有需求的时候立刻就会被执行的,但是 logrotate 却是在规定的时间到了之后才来进行登录档的轮 替, 所以这个 logrotate 程 ...

  8. POJ2594拐点弯的二分

    开始读题没理解题意,以为就是覆盖,可是怎么交都不对... 我就气愤了,结果去百度了一下发现奶奶的这题的机器人是可以隔点瞭望的,例如1->2->3.2->4.5->2  这个图 ...

  9. 光学字符识别OCR-8 综合评估

    数据验证 尽管在测试环境下模型工作良好,但是实践是检验真理的唯一标准.在本节中,我们通过自己的模型,与京东的测试数据进行比较验证.         衡量OCR系统的好坏有两部分内容:(1)是否成功地圈 ...

  10. poj2449 Remmarguts' Date K短路 A*

    K短路裸题. #include <algorithm> #include <iostream> #include <cstring> #include <cs ...