百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

快速上手系列-C语言之指针篇(四)函数与指针

citgpt 2024-07-10 14:45 10 浏览 0 评论

指针变量做函数的参数:

我们用一个例子来说明:交换两个变量的值

快速上手系列-C语言之指针篇(四)函数与指针

上面例子从打印信息可以看出,交换失败,为啥会交换失败呢?对于实参int a, int b实质是函数my_swap的局部变量,只是在调用的时候x,y分别将值赋给a,b,而x,y本身的值是没有变的,该过程只是对a,b进行了交换。

再来看一个例子:

可以看出,my_swap()中的形参int *a,int *b是两个指针变量,在调用my_swap()时,a,b分别指向变量x,y的地址,此时的交换是变量x,y的地址的内容交换,当然交换成功。

数组名作函数的参数:

一维数组名作函数的参数,一下两种写法都可以

  • 第一种方式:
  • 第二种方式:

数组做形参时,无需指定其下标,(其实a[i]只是*(a+i)的一种简写)。

这里需要注意一点,数组做行参时,无论传递的数组包含10个元素还是包含100个元素,传递的都是数组的地址,下面例子可以看出数组a[10]做参数,在函数内部使用sizeof(a)结果不是10,而是4(指针占用四个字节空间)。

二维数组名作函数的参数:

  • 二维数组名作为参数,行可以不写出来,列必须写出来,如:
  • 数组指针作形参,完全等价于二维数组的应用

指向函数的指针(函数指针):

一个函数在编译时被分配一个入口地址,这个地址就称为函数的指针,函数名代表函数的入口地址。

其声明格式为:返回值类型 (*fun_ptr)(参数列表)

如 int (*p)(int a, int b); p是一个指针变量,它指向一个函数,这个函数有2个整型参数,函数返回值类型为int。p首先和*结合,说明p是一个指针,然后再与()结合,说明它指向的是一个函数,指向函数的指针即为函数指针

来看个例子:

指向函数的指针(函数指针):

一个函数在编译时被分配一个入口地址,这个地址就称为函数的指针,函数名代表函数的入口地址。

其声明格式为:返回值类型 (*fun_ptr)(参数列表)

如 int (*p)(int a, int b); p是一个指针变量,它指向一个函数,这个函数有2个整型参数,函数返回值类型为int。p首先和*结合,说明p是一个指针,然后再与()结合,说明它指向的是一个函数,指向函数的指针即为函数指针

来看个例子:

函数指针的应用--回调函数:

函数指针变量常用的用途之一是把函数的指针作为参数传递到其他函数,当这个指针被用来调用其所指向的函数时,即为回调。

比如一个函数test,在调用它的时候,根据传入参数的不同实现不同的功能,输入a和b两个数,第一次调用test时找出a和b中大者,第二次找出其中小者,第三次求a与b之和等。看下面一个例子:

返回指针值的函数:指针函数

返回指针的函数:一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址;

定义形式为:类型名 *函数名(参数表列); 例如:int *a(int x,int y); 注意与指针函数int (*a)(int x,int y)不同。

注意:在调用时要先定义一个适当的指针来接收函数的返回值,这个适当的指针其类型应为函数返回指针所指向的类型。

  • 例:pc = (char *)malloc(100);
  • 表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc
  • char *pc=NULL;
  • pc = (char *)malloc(100);
  • void类型的指针
  • void指针是一种很特别的指针,并不指定它是指向哪一种类型的数据,而是根据需要转换为所需数据类型。

如上面的例子,不指定指针变量p具体指向哪一种类型的数据,而是根据需要转换为所需数据类型。

指针相关内容到此结束啦,后续内容开始写字符、字符串处理方面内容,想了解的小伙伴们请关注。

相关推荐

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果...

2024-10-24 16:21 citgpt

Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解

取消回复欢迎 发表评论: