指针&函数&数组&const

C语言——对数组和数组名、二维数组、指针和const的理解和总结 基于Windows10,Visual Studio 2019,x86,对C语言中的数组和数组名、二维数组的理解和总结 阅读详情

C语言中指针,函数,数组,const变量,单独来说,大家都不陌生.
但是,几个简单的事物组合起来,往往会生成奇异的变化。

基础介绍
指针是什么?
指针就是一个变量,它存储着指向变量的地址
函数是什么?

函数就是一个有着形参(可选),有着返回值(可选),有着名字(函数名)的代码块,这个代码块根据我们的需求实现了一定的功能,例如:

int max(int a, int b) {
     if(a > b)
          return a;
     return b;
}

一些说明:
 这里max()就是一个函数
 返回值:一个int型的变量
 形参:两个int类型的变量
 函数名:max
 功能:获取两个整形变量中最大值

数组是什么?
数组就是一个变量。这个变量可以存储指定数量,指定类型的值。例如:

int    a[3];//定义了一个名字为a,可以容纳3个整形值的数组(整型数组)
char    c[15];//定义了一个名字为c,可以容纳15个字符的数组(字符数组)

所谓const
const可以看做constant的缩写,就是声明一个常量,也就是只能读,不能改变,例如:

int const a=2;  //a此时是一个整形常量,它的值为2,只能读取,不能改变
a=3;    //Error,编译时,编译器会报错
嗯,貌似看起来很简单,应该可以一气呵成吧
确实是这样的,但是实际应用的时候,我们往往组合起来使用:
  • 函数指针,指针函数
  • 数组指针,指针数组
  • 常量指针,指针常量

函数指针和指针函数

函数指针
首先它是一个指针,然后,它指向一个函数,例如:
   int (*p)(int, int);    
   //这样,我们就定义了一个函数指针
   //它指向返回值为int,参数为两个int的函数

我们可以这样使用它:

   p=max;       //把max函数地址赋给p
   p=&max;    //把max函数地址赋给p
   /*这两种方法都是okay的,有点疑惑是吧,待会解释*/

定义一个整型变量,用来存储最大值:

   int max_value;

正常函数调用:

   max_value = max(2, 5);

好咯,我们开始使用函数指针:

   max_value = p(2, 5);       //就像函数调用[max(2,5))]一样使用它
   max_value = (*p)(2, 5);   //推荐的函数指针使用方法,与函数调用形成区别

好了,开始解释疑惑啦,你可能很纳闷为什么p=max和p=&max效果一样?

max是函数名,当max参与函数调用,或者直接赋值给函数指针时,它会自动转化成>函数指针常量;
而当你使用取地址符时,编译器会把它当作函数名,取出该函数的地址。

指针函数
啊,不要被吓到哦,它就是一个返回值为指针的函数
呵呵,是不是too simple了?
也举个例子吧:
  char *get_my_name();   //这就是一个指针函数

数组指针和指针数组

数组指针
指向数组的指针变量

指针数组
一个数组,数组的元素是指针
来个例子吧:
       int   (*arr1)[5];           //数组指针,指向一个数组容量为5的整形数组
       int    *arr2[5];           //指针数组,一个可以容纳5个整形变量的数组

定义一个二维数组吧:

       int    arr[3][5];           //一个行为3,列为5的整型数组
       //其实,也可以看做有着一个容量为3一维数组,
       //只是这个容量为3的一维数组的每一个元素都是一个容量为5的一位数组

二维数组指针和二维数组:

       arr1=arr[2];

那么,arr1[i] == arr[2][i]
还有一点需要注意的

       arr1 = arr1+1;
       //此时,arr1[i] == arr[3][i],也就是指针向后移动了1*5*sizeof(int)个字节

常量指针和指针常量

常量指针
一个指向常量的指针
也就是说这个指针指向的值不能改变
例如:
       int  zz=5;
       int  const * p=&zz;           .//常量指针
       *p = 6;           //Error:向只读位置‘*p’赋值,编译器会报错

但是

       int   d=4;
       p = &d;           //重新指向另一个指针

总的来说:常量指针指向的变量的值不能通过长里常量指针改变,但是常量指针的值却是可以改变的,即指向的位置可以改变。

指针常量
也是一个指针,不过其指针不能改变,但是指针指向的值可以改变。
你可以与常量指针对比来着
例如:
       int  * const pp=&zz;           //指针常量,指向整型变量zz
       *pp = 1124;           //zz的值被改变,变为1124
       pp=&d;           //Error:向只读变量‘p’赋值, 编译器报错

由此可见,指针常量使指针本身不变,但不影响其所指向的变量值的变化
哦,还有比较重要的事儿,指针常量在定义时就必须初始化哦,你可以试试。


Linux下的cdecl工具

终端下的使用
通过这个工具,我们很容易知道声明为何,
以下在linux下终端下输入,例如:

mwumli@mwumli-K43SA:~$ cdecl
Type help' or?' for help
cdecl>
 explain int zz;
declare zz as pointer to int
cdecl>
 explain int 
(zz)(int);
declare zz as pointer to function (int) returning pointer to int
*cdecl>
 quit

终端下的安装
这个工具在ubuntu中没内置,故痛过以下命令安装:
      sudo apt-get install cdecl
Revit实战:从零到一,手把手教你用族(Family)搭建一个完整的水闸BIM模型 本文详细介绍了如何使用Revit的族(Family)功能从零开始构建一个完整的水闸BIM模型。通过参数化族设计,实现闸门开度调整自动关联流量计算等智能化功能,提升水利工程BIM模型的工程价值和应用效率。文章涵盖族库规划、核心构件创建、高级技巧及BIM数据深度应用,为水利工程数字化提供实用指南。 阅读详情

相关推荐

大数据审计常用的算法模型

数据预处理:用聚类算法(K-Means)对数据分组,缩小分析范围;异常初筛:用孤立森林/DBSCAN快速标记疑似异常样本;风险分级:用随机森林/XGBoost对疑似异常打分,确定核查优先级;关联深挖:用FP-Growth挖掘异常样本背后的人员/流程关联;文本佐证:用BERT分析相关合同/审批文本,获取舞弊证据。例如,某审计项目通过“K-Means分组→孤立森林标异常→FP-Growth找关联→BERT审合同”的流程,仅用1周就完成了过去3个月需10人团队的工作量,且挖出2起隐藏的串标舞弊案。

Yulay专栏 1068

const关键字与数组、指针

开始回顾C基础知识。C中使用指针是很危险的事情,一个不慎就会造成程序崩溃,因此对于传入函数的参数进行保护就是必须的了,特别是针对数组。 const关键字 const关键字用于将一个变量声明为只读,也就是常量,无法被修改。 const int constant = 10;//声明constant为常量的同时对它进行初始化赋值 int const constant = 10;//也可以将const放在...

世事茫茫,光阴何其有限!(准备迁移至github.io) 8846

【Unity】ABB CRB 15000 外部引导运动实战:从配置到实时控制

本文详细介绍了ABB CRB 15000协作机器人的外部引导运动(EGM)功能在Unity环境中的实战应用。从RobotStudio配置到Unity实时通信架构,再到EGM运动控制技巧和问题排查,全面解析如何实现机器人的高精度实时控制。通过实际案例展示EGM技术在精密装配等场景中的显著效果,帮助开发者快速掌握这一先进技术。

weixin_29057695的博客 445

指针与const、指针与数组

但是不能是;否则会报错 "int (*)[2]" 类型的值不能用于初始化 "int *" 类型的实体。其实可以这样理解int a[2]就这个而言a数组里面的元素是int类型的,也就是说a[0]与a[1]是int类型的而a是int*类型的,因此a是一个指针,它指向a[0]这个地址,但它是一个大小固定并且指向的位置不能改变的。2.指针数组、数组指针p是一个指针,指向一个数组,数组内是两个整型数据若p+1,p+1 随机指向一片内存数组指针与int *q = &a[0]有什么区别呢?

M3151549808的博客 706

SAP ERPsim生产拓展实验报告

ERP课的实验和实践,也是SAP竞赛玩的东西,除了界面不华丽外很像游戏而且是团队型的pvp大乱斗

m0_67262022的博客 2020

笔记:使用Materials Studio计算聚合物的玻璃化转变温度

使用Materials Studio计算聚合物的玻璃化转变温度。

FXJgogogo的博客 1940

【const】与指针、数组、结构体的使用

但如果用const修饰性别时(const char sex),可以将s1.sex=‘女’修改指向。//此时,const修饰p变量,p只能指向a,也可修改a(当前仅当a是变量),但是p不可以任意指向。第二行定义指针p指向a可修改a,但第一行定义a为常量不允许被修改,自相矛盾,所以编译器提醒错误。//const char *src,表示函数strcpy不会修改 src指向的内容。//允许p指向a,但是不可修改a,p可以任意指向。name,指明姓名不能被修改,这样的用法是正确。//a为常变量,不可修改。

qq_53830608的博客 2134

FM20S用户手册--Linux系统启动卡制作及系统固化

评估板出厂时,默认提供一张配套的Micro SD卡,此卡为可正常使用的Linux系统 启动卡。评估板断电,将Linux系统启动卡插入评估板Micro SD卡槽,根据评估底板丝印将 启动方式选择拨码开关拨为1010(1-4).此档位为Micro SD启动模式。使用Linux 系统启动卡启动系统时,将使用此目录的BOOTbn文件启动FSBL和U-Boot。Linux系统启动卡制作时,已将固化系统的脚本文件mkemmcboot.sh拷贝至Linux系 统启动卡文件系统的"/opt/tools/"目录下。

创龙,嵌入式一体化解决方案商 302

指针详解(const、指针运算、数组名的理解、传址调用和传值调用、一维数组的本质​)(一)

在内存中,数组的元素是连续存储的,而数组名实际上是一个指向数组首元素的指针。它表示将数组名arr解析为指向数组首元素的指针,并使用索引i进行偏移,以访问数组中第i个元素的值。这实际上是向数组中输入数据。根据上述代码输出结果,我们发现数组名和数组首元素的地址打印出的结果一模一样,数组名就是数组首元素(第一个元素)的地址。1.sizeof内部单独放一个数组名的时候,数组名表示的就是整个数组,计算的是整个数组的大小单位是字节。数组传参的时候形参是不会创建数组的,实际上传的是首元素的地址,发生了数组降级。

走在努力路上的自己的博客 1069

Unity-TextMeshPro如何扩展材质实现字体Face+Outline流光效果

前言 TexeMeshPro 是Unity的一个Text文本插件,实现了比UGUI的Text,更好看的效果,跟高效的性能,所以深受大家的喜欢,但是再好的插件,也不是万能的,比如我们的策划有个新需求,要我们的VIP的名字比普通玩家有更好看的效果,例如:字体流光,外发光颜色扰动,字体贴图等等。那我们就需要去扩展TextMeshPRo的shader功能了。如下图所示 本文,我就带大家一起来扩展一下:如何扩展TextMeshProUGUI TextMesh原始面板 扩展功能后的面板 扩展TextMeshPro

TxNet 9675

【图像超分】论文精读:RepSR: Training Efficient VGG-style Super-Resolution Networks with Structural Re-Paramete

摘要: 本文提出RepSR,一种基于结构重新参数化和批量归一化(BN)的高效VGG式超分辨率网络。针对SR任务中BN易引发伪影的问题,作者通过分析发现训练-测试阶段的不一致性是主因,并提出先使用小批量统计训练、后期切换为总体统计的优化策略。RepSR块设计包含干净的残差路径和带改进BN的扩展-压缩卷积路径,有效平衡了训练非线性与推理效率。实验表明,RepSR在不同模型规模下优于现有重参数化方法,且实际推理速度更快。该工作为SR提供了性能与效率兼优的解决方案,相关代码未开源。 关键词: 超分辨率、结构重参数化

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 304

【C++---const引用】数组进行指针引用传递给函数error: non-const lvalue reference of type ‘int*&‘ to an rvalue

【const引用】数组进行指针引用传递给函数时出错 error: cannot bind non-const lvalue reference of type ‘int*&’ to an rvalue of type ‘int*’|`关于临时量关于常量引用(const的引用)const引用的对象不是不能被修改了吗,这里为什么被修改了?不是说是const引用吗?为什么又变成了引用所绑定的指针的【顶层const】?事实上:不使用常量引用会极大限制函数所能接受的实参类型,(因为我们)不能把const对象、

IDoWhatIDo_92761的博客 2120

第95章 安全工程师:Shell 脚本实现安全扫描、漏洞检测、日志审计

随着网络安全威胁日益复杂,传统的手动安全管理已无法满足现代企业的安全需求。Shell 脚本为安全工程师提供了强大的自动化能力,能够实现 7×24 小时的安全监控、快速漏洞扫描、智能日志分析和实时威胁响应。本章将系统介绍如何使用 Shell 脚本构建完整的安全防护体系,从基线检查到实时监控,帮助你打造自动化的安全运维能力。

猪猪侠 90

<<c++ primer>> 指向const对象指针&const指针

参见> 110页 > 一节 =-=-=-=-=-=-=-=-=-=-=-=-=-指向const对象指针关键理解=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--= const double *cptr;//指向const对象指针关键理解:可以指向非const对象, 但不能通过该指针修改所指向对象的值, =-=-=-=-=-=-=-=-=-=-=-=-co

viewtosay的专栏 401

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C语言变量&变量定义&变量声明&Const关键字使用

变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示:变量可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔。下面列出几个有效的声明:double d;声明并定义了变量 i、j 和 k,这指示编译器创建类型为 int 名字为 i、j、k 的变量。变量可以在声明的时候被初始化(指定一个初始值)。下面列举几个实例: extern int d = 3 , f = 5;

weixin_51624736的博客 1355

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C++中变量定义&作用域运算符&引用&const修饰符&C++字符串&强制类型转换

C++的变量定义举例 #include&lt;iostream&gt; using namespace std; int main() { struct student { int no; float math; }; int n; cin&gt;&gt;n; student wang; //C++中变量的定义语句可以出想在程序中的任意位置;可以使用结构体名定义变量。 wang.no=n; cin&gt;

BC 914

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

es6学习与理解之 let &const

let 和 const 命令 本文是在阮一峰老师的文章基础上进行的个人理解 1. let命令 ES6新增了let命令,用于声明变量,用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。 这里的代码块内指的是块作用域{} JS中作用域有:全局作用域、函数作用域。没有块作用域的概念。ECMAScript 6(简称ES6)中新增了块级作用域。 块作用域由 { } 包括,if语句和fo...

okboy519的博客 202

C++中引用&、const的用法

& (隐式指针)在变量声明时出现叫引用运算符(包括函数参数声明和函数返回类型的声明),其他地方都是地址运算符 简单理解就是对于某一变量找到另一个名称和它对应,本质上是同一内存变量。 #include <iostream> using namespace std; int main(){ int i=2; int &ir=i; cout<<i<<" "<<ir<<endl;

平行空间 803

从键盘中接收字符串

scanf("%d", &const char* str1)` 不符合语法。这是因为 `const char* str1` 是一个指向常量字符的指针,而 `%d` 是用于读取整数值的 `scanf` 占位符。请记住,在使用 `scanf` 读取字符串时,要确保为存储字符串的数组分配了足够的内存空间,以防止溢出。这样就可以读取用户输入的字符串并存储在 `str` 中了。

XXUZZWZ的博客 250

C++引用深度解析:从别名机制到现代C++实战应用

在C++编程中,引用是一种重要的变量别名机制,它允许程序员为现有变量创建另一个名称,从而在函数参数传递、返回值优化等场景中实现高效操作。从底层原理看,引用在编译时常被优化为目标变量的直接替换,实现了零开销抽象,这与指针存储地址的机制有本质区别。其技术价值在于提升代码安全性与表达力,通过强制初始化、禁止空值和重绑定,减少了内存访问错误。在应用场景上,常量引用能绑定临时对象并延长其生命周期,右值引用则支撑了现代C++的移动语义与完美转发,显著提升性能。本文聚焦C++引用的核心机制,通过对比指针、分析悬垂引用风险

weixin_34293141的博客 418

C++基础|const用法总结

   const 的主要作用是利用编译器帮助我们检查自己代码的正确性用const在代码中标示出“不应该改变”的地方,然后利用编译器检查这些地方是否真的没有被改变过,如果我们不小心修改而来这些地方,编译器就会报错 const在C和C++中的区别 C中,const修饰的量可以不用初始化,它本质上不是常量,叫常变量,不能当做常量使用如 const int a = 10; int arr[a]; 它不能作为左值被修改,但可以通过指针操作内存更改它的值 C++中,const修饰的量必须初始化,叫常量,可以

Youth_R的博客 324

C++常量与字面量:核心概念与高级应用

常量(const)和字面量(literal)是C++编程中的基础概念,它们在内存管理、编译优化和代码健壮性方面起着关键作用。常量通过const关键字实现运行时常量性,而字面量是直接嵌入代码的固定值。现代C++通过constexpr和consteval将常量计算提升到编译期,大幅提升性能。在工程实践中,合理使用原始字符串字面量、用户自定义字面量以及数字分隔符等特性,能显著提升代码可读性和安全性。对于大型项目,正确应用这些特性可以避免80%的意外修改错误,同时利用编译器优化如常量传播来提升执行效率。

weixin_30279671的博客 392

C++内存分区模型:代码区、全局区、栈区、堆区详解

内存分区模型是理解C++程序运行机制的基础概念,揭示了变量、函数和常量在物理内存中的实际布局与访问规则。其核心原理在于操作系统按用途将进程地址空间划分为代码区(只读指令与字面量)、全局区(已/未初始化数据)、栈区(自动管理的局部变量)和堆区(手动控制的动态内存)。这一模型直接支撑RAII资源管理、智能指针设计及安全编程实践,广泛应用于调试段错误、分析内存泄漏、优化STL容器行为以及配置C/C++开发环境(如VSCode+MinGW)等工程场景。掌握四区边界与交互,是跨越C++入门门槛、实现从语法到系统级认知

weixin_33737134的博客 378

C:从编译到运行,一个可执行程序的内存分区是如何构建与协作的?

本文详细解析了C语言程序从编译到运行过程中内存分区的构建与协作机制。重点介绍了代码区、栈区、堆区等核心内存分区的功能特点及交互原理,帮助开发者深入理解程序内存管理,避免常见内存错误并优化性能。

weixin_30875157的博客 403

C++ 学习(七)指针、const修饰指针、指针与数组、指针与函数

本章学习了指针,指针变量的定义、赋值及读取;指针占用的内存空间;空指针、野指针、const修饰指针、指针与数组、指针与函数(地址传参)。

ling1998的博客 543

【C++】const详解

常量概念是为了使程序员能够在变和不变之间画一条界限。给C++程序设计项目中提供了安全性和可控性。——《C++编程思想》 在编程中要尽可能多的使用const,这样可以获得编译器的帮助,以便写出健壮性的代码。  define宏定义,可以将常量赋值给一个变量,但由于在编译过程中只是简单的进行文本替换,并不会对赋值语句进行检查,因此会存在很多潜在的威胁,一旦定义出错,整个调用过程也讲出错。所以C+...

Twinkle 1467
上一篇: NFS的安装和配置(ubuntu)
mwumli
博客等级 码龄14年 2粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值