【C基础】指针/指针运算/二级指针/函数指针

指针定义:

指针是一种数据类型,使用它可以用来定义指针变量,指针变量中存储的其实是整数,这种整数代表了内存的编号。
指针的使用:
1、函数之间相独立,但有些时候需要共享变量。传参是值传递全局变量容易命名冲突使用数组还需要传递长度命名空间是独立的,但地址空间是同一个,所有指针可以解决这个问题。
2、由于函数之间传参是值传递(内存拷贝),对于字节数比较多的变量,值传递效率较低,如果传递变量的地址只需要传递4|8字节。3、堆内存无法取名字,它不能像data、bss、stack让变量名与内存建立联系,只能使用指针记录堆内存的地址来使用堆内存。
指针使用方法:
定义:类型* 变量名_p;1、指针变量与普通变量的用法有很大区别,建议在取名以p结尾加心区分。2、指针变量与普通变量一样默认值是随机的,一般初始为 NULL。3、指针的类型决定了它可以访问多少个字节。4、一个*只能定义一个指针变量。int* p1,p2,p3; // 只有p1 是指针变量,p2,p3都是int类型变量int *p1,*p2,*p3; // p1 p2 p3都是指针变量
赋值:变量名_p = 地址;指向栈内存:int* p = #指向堆内存:int* p = malloc(4);
解引用:*p空指针变量中记录的内存编号去访问内存,该过程可能产生段错误,原因是里面存储的内存编号是非法的。注意:访问的字节数由指针变量的类型决定。练习1、实现一个变量交换函数,调用它对一个数组进行排序。void swap(int* p1,int* p2);练习2、实现个函数计算两个整数的最大公约数,和最小公倍数,最大公约数用return返回,最小公倍数使用指针处理。3 6 33 6 6
要注意的问题:
空指针:值为NULL的指针变量叫空指针,如果进行解引用就会产生段错误。NULL也是一种错误标志,如果一个函数返回值是指针类型,当函数执行出错返回值就是NULL。如何避免空指针带来的段错误:使用来历不明的指针前做一判断。1、当函数的参数是指针,别人传给你的就有可能是空指针。2、从函数获取的返回值也可能是空指针。if(NULL == p)注意:NULL在绝大多数系统中是0,在个别系统中是1。野指针:指向不确定的内存空间。解引用野指针的后果:1、段错误2、脏数据3、一切正常野指针比空指针的危害更严重,因它无法判断出来,而且可能是隐藏型的错误短时间内不暴露出来。所有的野指针都是程序员自己制造出来的,如何避免产生野指针:1、定义指针变量时一定初始化。2、函数不返回栈内存的地址。3、指针指向的内存释放后,指针变量要及时置空。

指针运算:

指针变量中存储的是整数,理论上整型数据可以使用的运算符它都可以用,但大多数运算都无意义的。
指针+n <=> 宽度*n+指针  前面n个元素
指针-n <=> 指针-宽度*n  后退n个元素
指针-指针 <=> (指针-指针)/宽度 计算出两个指针之间相隔多少个元素

const与指针:

const int* p; 指针所指向的内存不可修改。当我们为了提高传参的效率而使用指针时,传参的效率高了,但变量也有被修改的风险,这种写法可以保护指针所指向的内存。
int const *p; 同上
int * const p; 指针变量不可被修改
const int* const p; 指针变量和指针所指向的内存都不可修改。
int const * const p; 同上

指针数组与数组指针:

指针数组:就是由指针组成的数组,它的成员是指针变量。类型* arr[长度];
数组指针:专门指针数组的指针。类型 (*arr)[长度];

指针与数组名:

数组名是一种特殊的指针,它是常量,不能修改它的值,它与数组的内存是映射关系。数组名 == &数组名指针变量有自己的存储空间,如果它存储是数组的首地址,指针可以当数组使用,数组名也可以当指针使用。数组名[i] == *(数组名+1)数组作为函数的参数时入脱变成了指针,所以长度丢失。

二级指针:

二级指针就是指向指针的指针,里面存储的是指针变量的地址。
定义:类型** 变量名_pp;
赋值:变量名 = &指针;
解引用:*变量名 <=> 指针**变量名 <=> *指针

函数指针:

函数名就个地址(整数),它代表函数在代码段中所处的位置。函数指针就是指向函数的指针,它里面存储是函数在代码段中所处位置(函数名);typedef 返回值 (*函数指针)(类型1 参数名1,类型2 参数名2...);
函数指针 fp;使用了回调模式的库函数:
// 快速排序
void qsort(void *base, size_t nmemb, size_t size,int(*compar)(const void *, const void *));// 二分查找
void *bsearch(const void *key, const void *base,size_t nmemb, size_t size,int (*compar)(const void *, const void *));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中医养生 选对方法就成功一半

在医院门诊室&#xff0c;因为肠胃不适前来看病的林先生。问及他平时的养生之道&#xff0c;他笑谈&#xff0c;现在也正困惑着呢。 原来&#xff0c;最近他有两个朋友&#xff0c;在单位体检时分别被查出患有肾结石和胆囊炎&#xff0c;他本人最近也犯胃病。 最令人奇怪的一…

二叉查找树,红黑树

漫画算法&#xff1a;什么是红黑树&#xff1f;&#xff08;适合初学红黑树小白简单易懂&#xff09; 2018年09月14日 09:55:54 苏杭-Java工程师 阅读数&#xff1a;494———————————— 二叉查找树&#xff08;BST&#xff09;具备什么特性呢&#xff1f; 1.左子树上所…

如何在 CentOS 7上安装和使用 Docker Compose

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 介绍 Docker是一个很好的工具&#xff0c;但要真正充分利用它的潜力&#xff0c;最好是应用程序的每个组件都在它自己的容器中运行。对于…

WebSSH2安装过程可实现WEB可视化管理SSH工具

目录 Chrome web Secure Shell Extension gotty GateOne noVNCvncserver XtermjsSSH2nodejs nodejstty.js CheungSSH TriAquae https://github.com/Scirh/Python/tree/master/django https://www.smarthomebeginner.com/install-shellinabox-on-ubuntu/#64-bit https://gist.gi…

原码反码补码位运算,

进制转换&#xff1a; 十进制转二进制&#xff1a; 求余法&#xff1a;用2对数据求余&#xff0c;然后再对商继续求余&#xff0c;直到商为0结束&#xff0c;过程中产生的余数就是该数据的二进制(逆序)。 求权法&#xff1a;数据 - 2^(n-1) 如果可以减 第n位就是1&#xff0c;否…

一个人幸运的前提,是他有能力改变自己

很多时候&#xff0c;我们羡慕那些幸运的人&#xff0c;却看不到他们为此做出的努力和改变。 其实&#xff0c;一个人的幸运并不是偶然的&#xff0c;美国成功哲学家金洛恩说过这么一句话&#xff1a;“成功不是追求得来的&#xff0c;而是被改变后的自己主动吸引来的。” …

剑指Offer-正则表达式匹配(Python)

1 题干内容 请实现一个函数用来匹配包括.和*的正则表达式。模式中的字符.表示任意一个字符&#xff0c;而*表示它前面的字符可以出现任意次&#xff08;包含0次&#xff09;。 在本题中&#xff0c;匹配是指字符串的所有字符匹配整个模式。 例如&#xff0c;字符串aaa与模式a.a…

Docker 制作镜像的方式

其它制作镜像的方式 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 除了标准的使用 Dockerfile 生成镜像的方法外&#xff0c;由于各种特殊需求和历史原因&#xff0c;还提供了一些其它…

【算法】快排

快速排序 其利用的思想就是分治思想&#xff0c;最开始先从数组中随机选择一个元素p&#xff08;为什么随机下面解释&#xff09;&#xff0c;然后以这个元素对数组中的元素进行分类&#xff0c;数组左侧都是小于p的元素&#xff0c; 右侧都是大于等于p的元素。这样就让数组分成…

【C基础】堆内存创建/释放和内存清理函数/内存泄漏

本期涉及到了较多的指针&#xff0c;没有彻底领悟的同学请翻阅之前的博文~ 一闪一闪亮晶晶&#xff0c;满天都是小星星*** 什么是堆内存&#xff1a; 是进程的一个内存段(text、data、bss、heap、stack)之一&#xff0c;由程序员手动管理&#xff0c; 特点就是足够大&#x…

19_05_01校内训练[polygon]

题意 把一个边长为1的正n边形放到一个正m边形中&#xff0c;要求m边形完全覆盖n边形&#xff0c;可以有交点&#xff0c;并且中心重合。求正m边形的最小边长&#xff0c;至少精确到6位。要求logn计算。 思考 先考虑m|n的情况。 我们知道&#xff0c;正m边形的边长与可行区域&am…

六度人脉 全球最高效的人脉法则(图)

六度人脉这一概念&#xff0c;在20世纪60年代由美国心理学家Stanley Milgram提出并验证。 所谓六度人脉&#xff0c;即地球上所有的人都可以通过六层以内的熟人关系链和其他人联系起来。 通俗地说&#xff1a;“最多通过六个人你就可以认识地球上任何一个陌生人。” SNS(社会…

[转]numpy中的np.max 与 np.maximum区别

转自&#xff1a;https://blog.csdn.net/lanchunhui/article/details/52700895 转载于:https://www.cnblogs.com/xianhan/p/10609319.html

JVM 的 Finalization Delay 引起的 OOM(java.lang.OutOfMemoryError:null at sun.misc.Unsafe.allocateMemory.)

今天在压力测试环境某一个服务出现crash了&#xff0c;经过一番检查&#xff0c;终于发现是由于JVM的Finalization Delay引起的&#xff0c;这个问题比较特殊&#xff0c;这里记录一下。 这个服务是用Java写的&#xff0c;主要完成的功能是根据特定的指令文件生成mp4文件&#…

win10 php7+apache2.4的配置以及遇到的问题及解决

首先进入PHP官网下载php7的版本,我下的是PHP7.1.28,在PHP的下载页面注意划红线和绿线的地方(我画的) 1.画了红线的意思是请使用由apache lounge提供的编译文件,也就是点进蓝色Apache lounge这里下载. 2.画了绿色的线的意思是用Apache的话你必须使用Thread Safe(线程安全)的PHP…

缓存区的输入输出,字符串常用操作,实现strlen/strcpy/strcat/strcmp函数)

输出缓冲区&#xff1a; 程序输入的数据并不能立即显示在屏幕上&#xff0c;而是先存储在输出缓冲区中&#xff0c;满足一些条件后才显示出来。 1、遇到\n后 2、遇到输入语句 3、当输出缓冲区满4K 4、当程序结束 5、手动刷新 fflush(stdout) 缓冲区机制可以提高数据的读写速度…

理性分散投资 收益袋袋平安

理财锦囊 想要投资理财&#xff0c;不光可以选择股票和债券这类入门产品&#xff0c; 实际上&#xff0c;还可选择其他低风险及高回报的投资产品&#xff0c;例如外汇、期货和商品。 针对此&#xff0c;几位分析师预测了2014年各国经济走势的重点&#xff0c;协助散户们分配…

AI一周热闻:华为豪掷3.3亿剑桥买地,自建光芯片工厂;比特大陆IPO失败,组织架构调整...

导读 华为豪掷3.3亿剑桥买地&#xff0c;自建光芯片工厂苹果春季发布会无硬件发布&#xff0c;转型之心迫切比特大陆IPO失败&#xff0c;组织架构调整&#xff0c;王海超任CEO特斯拉起诉小鹏汽车员工窃取商业机密英伟达发布GauGAN&#xff0c;线条色块秒变逼真图像用机器学习防…

Docker 环境:Nexus3.x 的私有仓库

Nexus3.x 的私有仓库 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 使用 Docker 官方的 Registry 创建的仓库面临一些维护问题。比如某些镜像删除以后空间默认是不会回收的&#xff…

虚拟环境vitualenv的使用

Python3开发之虚拟环境virtualenv与virtualenvwrapper 在使用 Python 开发的过程中&#xff0c;工程一多&#xff0c;难免会碰到不同的工程依赖不同版本的库的问题&#xff1b; 亦或者是在开发过程中不想让物理环境里充斥各种各样的库&#xff0c;引发未来的依赖灾难。 此时&am…