c语言指针详解

详解C语言中的二级指针 在C语言中,二级指针是指一个指向指针的指针,用于指向一个指针的地址。数据类型 **变量名;其中,数据类型为指针类型,变量名为二级指针变量的名称。本篇文章详细介绍了二级指针的定义、计算规则、读写操作以及取地址操作。通过掌握二级指针的使用,C语言程序员可以更加灵活地操作多级数据结构,并提高程序的执行效率和可读性。 阅读详情

目录

初阶指针

 进阶指针


初阶指针

1.指针是什么

指针是用来存放地址的,地址是唯一标示一块地址空间的。

指针的大小在32位平台是4个字节,在64位平台是8个字节。

2.指针和指针类型

指针类型决定了:指针解引用的权限有多大,也就是能访问几个字节。

3.野指针

野指针就是指针指向的位置是不可知得(随机的,不正确的)。

如何规避野指针

这里我把它分为四点,分别为,指针初始化,小心指针越界,指针指向空间释放即置为NULL,指针使用前检查有效性。

4.指针运算

指针+-整数

指针-指针 指针和指针相减的前提:俩个指针指向同一块空间

指针的关系运算

5.二级指针

指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?这就是二级指针。

 6.指针数组

指针数组是指针还是数组?

答案:是数组,存放指针的数组。

 进阶指针

1. 字符指针
在指针的类型中我们知道有一种指针类型为字符指针 char*。

2.数组指针
 数组指针是指针还是数组?
答案是:指针。

int (*p)[10];
//解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个指针,指向一个数组,叫数组指针。
//这里要注意:[]的优先级要高于*号的,所以必须加上()来保证p先和*结合。
&数组名VS数组名
我们知道arr是数组名,数组名表示数组首元素的地址。
&数组名取出的是整个数组地址

3.数组指针的使用

那数组指针是怎么使用的呢?
既然数组指针指向的是数组,那数组指针中存放的应该是数组的地址。

 4. 数组参数、指针参数

4.1 一维数组传参

4.2 二维数组传参


 4.3 一级指针传参和二级指针传参

一级指针传参一级指针接收

二级指针传参二级指针接收

5. 函数指针

其实就是用指针保存函数的地址

例如一个函数是 void fun(int a,int b)那么他的函数指针是void (*p)(int,int)。

我再举个例子 int as(int *a,char b) 对应的函数指针是int (*p)(int *,char)。

当然具体怎么用,这就需要自己去尝试,毕竟学习一味的看不去用是理解不了的。

6. 函数指针数组
数组是一个存放相同类型数据的存储空间,那前面已经说了指针数组

那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?

就是这样的,函数指针数组的用途:转移表
例子(计算器)

#include <stdio.h>
int add(int a, int b)
{
    return a + b;
}
int sub(int a, int b)
{
    return a - b;
}
int mul(int a, int b)
{
    return a * b;
}
int div(int a, int b)
{
    return a / b;
}
int main()
{
    int x, y;
    int input = 1;
    int ret = 0;
    int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表
    while (input)
    {
        printf("*************************\n");
        printf(" 1:add 2:sub \n");
        printf(" 3:mul 4:div \n");
        printf("*************************\n");
        printf("请选择:");
        scanf("%d", &input);
        if ((input <= 4 && input >= 1))
        {
            printf("输入操作数:");
            scanf("%d %d", &x, &y);
            ret = (*p[input])(x, y);
        }
        else
            printf("输入有误\n");
        printf("ret = %d\n", ret);
    }
    return 0;
} 

7. 指向函数指针数组的指针
指向函数指针数组的指针是一个 指针
指针指向一个 数组 ,数组的元素都是 函数指针

定义

C语言函数指针详解 C语言函数指针 一、什么是函数指针 1.理解函数指针 ​ 函数指针,首先根据他的名称我们就大概可以了解到他是一个指针,是什么样的指针呢?是和函数有关的一种特殊的指针。 ​ 我们知道 int*p 是指向int型变量的指针,char*p是指向char型变量的指针,那么不难理解,函数指针就是一个指向函数的指针。 int arr[10]={0}; int *p = arr; ​ 我们知道,在数组中数组名就是首元素的地址。 ​ 那么试着猜猜看,函数的地址是什么样的情况呢。 ​ 我们不妨打印一下看看结果是什 阅读详情

相关推荐

C语言:指针详解

指针是一个变量,其值为另一个变量的内存地址。换句话说,指针“指向”另一个变量的存储位置。指针的类型决定了它所指向的变量类型。通过指针,我们可以直接访问和操作内存中的数据,这使得指针在C语言中具有非常强大的功能。指针数组 首先 他是数组是存放指针的数组数组指针 就是指针指向数组的指针存放数组的地址特性函数指针(Function Pointer)指针函数(Pointer Function)声明格式返回值类型 (*变量名)(形式参数列表)指针类型 函数名(形参列表)用途。

m0_64392809的博客 1599

【C语言】标准函数库

标准函数库 1. 整型函数 1. 算术函数 在标准库stdlib.h中; 1. int abs(int) 取一个数的绝对值; 如果这个数的绝对值不能以整数的形式出现,则会返回一个未定义。 2. long int labs(long int) 同样是取一个数的绝对值,只不过这个函数的作用范围更广。 3. div_t div(int, int) 求一个数的商和余数 返回一个包含商和余数的结构体。 结构体div_t: quot:商 rem:余数 4. ldiv_t ldiv(long i

Miraitowa_Hygge 的博客 1231

SAP CO-PA数据传送避坑指南:销售开票与FI/MM记账的日常配置实操(含KEKF/KE4I/KEI2)

本文深入解析SAP CO-PA数据传送中的常见配置问题,特别是销售开票与FI/MM记账环节的实操避坑指南。通过KEKF/KE4I/KEI2等关键配置点的详细说明,帮助用户避免数据失真和重复记录,提升获利能力分析的准确性。文章结合实战案例,揭示官方文档未提及的'数据黑洞'形成机制,为SAP顾问提供实用的排雷手册。

weixin_26905487的博客 390

指针

  指针用于指向单个对象,指针保存的是指向对象的地址指针的定义和初始化Int *p1,*p2; //即p1只能指向int 型的对象Vector *pvec;String *p3; //理解指针时由右向左读 另一种声明的风格:Int* p1;//这种声明没有错误,但是容易造成一些误解Int* p1,p2; //很多人会认为p2也是指针变量,但是p2其实是int型变量指针可

rbagglo的专栏 853

SpringBoot文件上传实战:MultipartFile重复读取的3种方法(附避坑指南)

本文详细介绍了SpringBoot中处理MultipartFile重复读取的3种实用方法,包括字节数组缓存法、临时文件法和流重置法,并提供了避坑指南和性能优化技巧。特别适合需要多次读取上传文件内容的开发者,帮助解决InputStream流只能读取一次的问题。

weixin_28710999的博客 398

多思计算机组成原理实验:模型机课程设计

计算机组成原理实验教程 基于多思网络虚拟实验系统 张雯雰

Nick的博客 2万+

c语言中函数的使用

其中库函数需要我们添加头文件才能调用,如。

2301_79795056的博客 442

kbjdbc: autodetected server-encoding to be ISO-8859-1, if the message is not readable, please check

这条信息是来自 KingbaseES 数据库的一个 JDBC 客户端连接提示。KingbaseES 是一个企业级的关系型数据库管理系统,它兼容 PostgreSQL 的许多特性。如果上述步骤仍然无法解决问题,建议详细查看数据库和客户端的日志文件,以获取更具体的错误信息。此外,也可以考虑联系 KingbaseES 的技术支持获取帮助。项目融合kingbase数据库,输出日志乱码。结果:网上各种调整各种试。

zjy660358的专栏 4844

乘法(函数)

嗯,先写个乘法函数 #include <stdio.h> int mul(int x, int y) { int z = 0; z = x * y; return z; } int main() { int a = 5; int b = 8; int c = mul(a, b); printf("%d\n", c); return 0; } 先定义 mul 函数,然后在主函数中调用。 ...

人言束负兑生|完美是完蛋的开始 1655

静止无功补偿SVG的基本控制原理

上图是自励单变量控制框图,基本控制方式为,采集计算得到负载无功电流和SVG输出的无功电流的差值,经过PI调节作为功率角δ和固定的调制深度λ和调制波,经过PWM调制形成开关信号驱动SVG的功率电路。该控制方式使保持调制深度λ(即SVG电压的幅度)不变,通过调整δ来调整直流电压和无功,跟踪输出无功功率,直流电压就会大幅度随动,无功相应速度较慢。SVG通常有他励方式和自励方式,他励方式需要提供外部的直流电源,自励方式通过电网输出有功功率至SVG建立SVG的直流电压。δ为Us和Uc之间的相角差。

weixin_42668920的博客 1989

Arduino——GY39大气压、温湿度、光照模块

前几天买东西的时候买了一个GY39,这个模块集成了温湿度,大气压,海拔,光照一体,使用起来很方面。它有两种工作模式使用串口模式时需要搭配转接板,我选择了IIC模式,看一下通信协议吧,就是关于高八位和低八位的数据。看一下接线。

戚晨夕的博客 2605

C++的动态内存:C++的指针

在C++里,指针(pointer)变量被用来存储内存地址。C++要求使用特定的类型来定义指针。这个类型被用来指示需要如何去解释内存地址里的数据。我们已经知道,在计算机的内部,内存存储的是1和0,而C++的变量类型将会告诉编译器它所生成的代码应该如何去解释这些比特数据。同时,由于指针变量被用来存储内存地址,因此所有的指针变量都会需要相同的内存空间(32位系统上的4字节)。这就有点像是Python里的引用了。C++的指针是一个类似于Python的引用的概念。它们的区别在于:使用C++的指针,你可以访问指针指向的

人邮异步社区 1172

Matlab2018a崩溃解决的办法No sandbox or build area path

Matlab 2018a (No sandbox or build area path)出现崩溃后需要使用terminal进行如下操作: cd /home/david/MySoft/MATLAB/R2018a/bin/glnxa64 (你的matlab路径) mkdir exclude mv libfreetype* exclude/ 执行后图片如下: 如果你用的Windows系统,请手动按照上面步骤剔除了dll。 Matlab 2018a (No sandbox or build are

David Xiao 1万+

C语言中的指针详解

1. 指针的定义 C语言中指针是一种数据类型,指针是存放数据的内存单元地址。 计算机系统的内存拥有大量的存储单元,每个存储单元的大小为1字节,为了便于管理,必须为每个存储单元编号,该编号就是存储单元的“地址”,每个存储单元拥有一个唯一的地址。 指针变量除了可以存放变量的地址外,还可以存放其他数据的地址,例如可以存放数组和函数的地址。 2. 指针的定义和初始化 格式:数据类型符 *指针变量名[=初始地址值]。 功能:定义指向“数据类型符”的变量或数组的指针变量,同时为其赋初值。

分享前端工程化、AI 应用、Agent 开发与大模型实践! 6万+

用Python玩转Iris数据集:从数据加载到可视化分析的完整指南

本文提供了使用Python处理Iris数据集的完整指南,涵盖数据加载、探索性分析、特征工程和可视化呈现等关键步骤。通过Pandas、NumPy、Matplotlib和Seaborn等工具,读者将学习如何从零开始完成一个机器学习项目的数据分析流程,掌握数据科学的核心技能。

j2k3l4的博客 850

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

c语言—指针详解

文章目录一、指针是什么二、指针和指针变量1.左值与右值2.两者的区别1.指针2.指针变量3.如何使用三、指针和指针类型 一、指针是什么 指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。 指针就是地址,地址就是指针。 使用指针的目的是提高使用效率 二、指

Welcome to my blog. 2万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C语言指针详解

指针详解

ltzoro的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C语言——指针详解 下

函数指针变量是用来存放函数地址的,未来可以通过地址调用函数。函数的地址就是函数名,Fun与&Fun完全等价。例如:将 unsigned int 改写为 uint。输出示例:那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组。parr1 先和 [ ] 结合,说明parr1是数组,数组的内容是 int ( * )( ) 类型的函数指针。回调函数就是一个通过函数指针调用的函数。如果你把函数的指针作为参数传递给另⼀个函数,当这个指针被用来调用它指向的函数时,被调用的函数就是回调函数。

2401_84221778的博客 1279

【C语言进阶】指针详解

C语言中的指针是理解和使用C语言的关键部分。它们提供了对内存的直接访问能力,指针的使用可以极大地提高程序的效率和灵活性。但同时也需要谨慎使用,以避免内存泄漏、越界访问等错误。

byte轻骑兵的技术小窝 1万+

C语言指针详解(三)

今天也要Fighting with code!

injury486894的博客 1400

C语言指针详解(二)

C语言指针详解(二)

QYJN123456的博客 1629

C语言之指针详解

当初学C语言,指针是最头疼的地方,难以理解,不过时间长了就自然明白了通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。每一个变量都有一个内存位置,每一个内存位置都定义了可使用&运算符访问的地址,它表示了在内存中的一个地址。用register修饰的变量是没法取到地址的,没有内存位置int * p;// 定义指针变量 p = & var_runoob;printf("var_runoob 变量的地址: %p\n" , p);return 0;

上善若泪 4万+

C语言指针详解(通俗易懂)

前言 刚开始接触C语言,对C语言中的指针有一点不能理解,接着还有一个"&"符号感觉两者有点接近和混淆。两者的定义如下: &是取地址符号 *是定义指针变量,即指向内存单元的指针 指针是C/C++语言的特色,它允许程序员直接操纵内存,所以说C语言是一种高效的语言。很多语言屏蔽了编程人员直接操纵内存的权限去降低软件开发的难度。 & #include<stdio.h&gt...

how2js的博客 2万+
上一篇: 成为一名程序员的开始
下一篇: 关于字符串函数
pythoncjavac++
博客等级 码龄5年 718粉丝 71原创
评论 17
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pythoncjavac++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值