首页 > 其他分享 >C语言-指针进阶

C语言-指针进阶

时间:2023-03-06 22:37:31浏览次数:57  
标签:进阶 函数 int C语言 数组名 数组 函数指针 指针

一、字符指针

char* p= "hello world"

printf(*p),程序语句会输出“h”

本质上是把“hello world”这个字符串的首地址存储在了字符指针变量p

典型例题:

C语言-指针进阶_指针进阶

二、指针数组

指针数组是数组,数组中存放的是指针(地址)

举例:

int* arr1[3],   存放整型指针的数组

char* arr2[3],一级字符指针数组

char** arr3[3],二级字符指针数组

三、数组指针

数组指针是数组还是指针

是指针!指向数组的指针

代码举例:

int arr[] = (1,2,3,4);

int (*parr)[10] = &arr;

parr就是一个数组指针,存放的是数组的地址

&数组名 vs 数组名

&数组名:取出的是数组的地址

数组名:取出的是首元素的地址

C语言-指针进阶_C语言_02

C语言-指针进阶_C语言_03

通常情况下,数组名是数组首元素的地址

但有两个例外:

1、sizeof(数组名)-数组名表示整个数组,计算的是整个数组大小,单位是字节

2、&数组名-数组名表示整个数组,取出的是整个数组的地址

对数组指针进行解引用相当于得到一个数组名

C语言-指针进阶_指针进阶_04

应用举例:

在函数中,用数组指针接受二维数组地址参数

C语言-指针进阶_指针进阶_05

区分:

C语言-指针进阶_C语言_06

C语言-指针进阶_C语言_07

四、数组参数、指针参数

1、一维数组传参

C语言-指针进阶_C语言_08

2、二维数组传参

C语言-指针进阶_C语言_09

总结:二维数组传参,函数形参的设计只能省略第一个[]的数字。原因在于,为了方便运算,二位数组可以不知道多少行,但必须知道一行多少元素

C语言-指针进阶_C语言_10

总结:二维数组如果以指针形式传递,需要数组指针

3、一级指针传参

一级指针传参,一级指针接受

C语言-指针进阶_指针进阶_11

思考:当一个函数的参数参数部分是一级指针时,函数接受什么参数呢?

同样,函数接受的是一个一级指针

4、二级指针传参

C语言-指针进阶_指针进阶_12

思考:当函数的参数是二级指针的时候,可以接受什么参数?

可以有三种形式:

C语言-指针进阶_C语言_13

知识汇总:

C语言-指针进阶_C语言_14

五、函数指针

指向函数的指针!存放的是函数的地址

&函数名 - 取到的就是函数的地址

同时:函数名,也是函数的地址

C语言-指针进阶_指针进阶_15

C语言-指针进阶_指针进阶_16

注意:

C语言-指针进阶_指针进阶_17

函数指针编写格式:

返回值类型 (*指针名)(参数类型......)

如,对上述Add函数:

C语言-指针进阶_指针进阶_18

如何用函数指针调用函数?

//二者等价
int ret = (*pf)(3,5)
int ret = pf(3,5)
//不可写成
int ret = *pf(3,5)
//原因在于()的优先级高于*,
//理解为对pf函数的返回值进行解引用

阅读两段有趣的代码:

C语言-指针进阶_指针进阶_19

推荐《C陷阱和缺陷》,本书中又提及这两个代码

代码一解读:

C语言-指针进阶_C语言_20

代码二解读:

C语言-指针进阶_指针进阶_21

代码二,函数声明简化

typedef - 对类型进行重定义

C语言-指针进阶_C语言_22

六、函数指针数组

概念:存放函数指针的数组

C语言-指针进阶_指针进阶_23

同理:在函数指针数组中,Add可以写为pf1,Sub可以写为pf2,原因上文有所提及,二者等价

函数指针数组的用途:转移表—《c和指针》,起跳板作用,简化代码

C语言-指针进阶_C语言_24


七、指向函数指针数组的指针

释义:是一个指针,指针指向一个数组,数组的元素都是函数指针

如何定义?

数据类型(*(*指针名)[数组长度])(参数类型 ,参数类型)

举例:int(*(*p3)[4])(int,int) = &p2

p2为函数指针的数组

C语言-指针进阶_指针进阶_25

八、回调函数

        回调函数是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们称其为回调函数

C语言-指针进阶_指针进阶_26

喜欢或有所帮助,就帮忙点个赞吧~~~



标签:进阶,函数,int,C语言,数组名,数组,函数指针,指针
From: https://blog.51cto.com/u_15910342/6104040

相关文章

  • (C语言)实现对注册表创建修改,查询,删除操作的简单操作
    最初是发现有款软件是根据注册表的数据判断限免额度,但手动更改注册表比较麻烦,然后尝试用bat写一个一键更改的,但bat写条件判断比较麻烦,然后想到了C语言可以直接编译exe执行......
  • (C语言)实现对注册表创建修改,查询,删除操作的简单操作(省略版)
    前言本文为省略版直接贴代码,用就完事了,下文三个方法都为独立模块可以单独调用,详细步骤版在这,点击跳转。一、代码实现#include<stdio.h>#include<Windows.h>//删......
  • E. Boring Segments (双指针 + 线段树)
    E.BoringSegments(双指针+线段树)题意:给出n条线段的左右端点和权值$l_i$,$r_i$,$w_i$。要求选择一些线段,使得能够从数轴上的1出发,沿着线段走,能够到达m(连通,不是覆盖)。问......
  • Linux & 标准C语言学习 <DAY7>
    一、windows下获取方向键:  1、导入#include<conio.h>  2、通过getch()获取键盘上的键值    上:72 下:80 左:75 右:77  二、Linux下获取方向......
  • C语言常用库函数
    常用string库函数、printf打印文件名行号、sprintf拼接、时间字符串和时间戳互相转换一、字符串的复制比较用strcpy或strncpy,strcmp。如果用如下函数比较(memcmp)则会出错。......
  • 《C语言中char是根据编译器来确定是有符号还是无符号》
    在C语言中,char类型的有无符号是依赖于具体的编译器实现的。在一些编译器中,char类型是有符号的,而在另一些编译器中,char类型是无符号的。由于C语言标准并没有规定char类型应......
  • 剑指Offer57 - 数学/滑动窗口(双指针)
    1.题目描述和为s的连续正数序列2.思路O(N)数学做法。等查求和公式,求根公式:\(\frac{-b\pm\sqrt{b*b-4*a*c}}{2*a}\)求根公式在不少题目中的优化做法可能......
  • 第一章 C语言:数据存储
    一、大小端存储大端存储:数据的低位字节存储在高地址小端存储:数据的低位字节存储在低地址不同编译器有不同的存储方式inta=10;char*p=(char*)&a;printf(......
  • c语言中有符号和无符号数字
    https://nju-projectn.github.io/ics-pa-gitbook/ics2022/why.html#数组求和数组求和intsum(inta[],unsignedlen){inti,sum=0;for(i=0;i<=len-1;i++)......
  • Linux & 标准C语言学习 <DAY1>
    Linux系统简单介绍:  BCPL->NewB->C->UNIX->Minix->Linux->gcc  美国贝尔实验室1968  Linux管理硬盘的能力非常强,所以只有一个磁盘分区  cd路径名......