一、在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. HomeKit开发(一)

    需求:因为公司的生产硬件需要进入苹果的HomeKit市场,因此需要一款供苹果审核的APP(功能:苹果的家庭软件的功能+公司的硬件支持的功能特有功能)需求驱动开发:最近做了一款苹果HomeKit的软件 ...

  2. Falsy Bouncer-freecodecamp算法题目

    Falsy Bouncer(过滤数组假值) 要求 删除数组中的所有假值.(在JavaScript中,假值有false.null.0."".undefined 和 NaN.) 思路 ...

  3. 浅谈 MySQL 中优化 SQL 语句查询常用的 30 种方法

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...

  4. paper:synthesizable finit state machine design techniques using the new systemverilog 3.0 enhancements之全0/1/z/x的SV写法

  5. 【java】类成员的访问限制关系

  6. hashable与unhashable

    不可哈希(unhashable):就是指其可变,如列表.字典等,都能原地进行修改. 可哈希(hashable):不可变,如字符串.元组那样,不能原地修改. 利用set()和{}建立集合时,要求集合中的 ...

  7. mysql Plugin ‘InnoDB’ init function returned error

    问题描述: 非正常关闭mysql,同时更改了my.cnf 导致启动时不支持innodb,出现如下错误:   [ERROR] Plugin ‘InnoDB’ init function returned ...

  8. spring关于@Autowired和@Qualifier的使用

    // package com.jhc.model; import org.springframework.stereotype.Component; @Component public interfa ...

  9. bash数组操作-定义/初始化/赋值…

    数组:     连续的多个独立内存空间,每个内存空间相当于一个变量     数组元素:数组名+索引         索引:从0开始编号             声明数组:         declar ...

  10. window 7上安装Visual Studio 2017失败的解决方法

    今天在办公电脑上windows 7系统上装Visual Studio 2017企业版的时候遇到了一个让人懵逼的错误. 为啥说懵逼呢,因为昨天楼主在台式机上同样安装2017没有任何问题啊,台式机上是wi ...