您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

深入理解C语言的指针

时间:2019-07-31 17:08:59  来源:  作者:

 

指针是C语言的一个核心特色,它以一种统一方式对不同数据结构中的元素产生引用。对于新手来说,指针总是会带来很多困惑,但其实指针的基本概念非常简单。下面是一些指针和它们映射到机器代码的关键原则。

1、每个指针都对应一个类型

指针类型表明指针指向的是哪一类对象。比如:

int *ip;

char **cpp;

变量ip是一个指向int类型对象的指针,而cpp指针指向的对象自身就是一个指向char类型对象的指针。

通常,如果对象类型是T,那么指针的类型为T*。特殊的void *类型代表通用指针。比如malloc函数返回一个通用指针,然后通过显式强制类型转换或赋值操作的隐式强制类型转换,将它转换成一个有类型的指针。

指针类型不是机器代码中的一部分,它是C语言提供的一种抽象,帮助程序员避免寻址错误。

2、每个指针都有一个值

指针的值是某个指定类型的对象的地址。特殊的NULL(0)值表示该指针没有指向任何地方。

3、用“&”创建指针

“&”运算符可以应用到任何value类的C表达式上,value类指可以出现在赋值语句左边的表达式,包括变量、结构和数组的元素。

4、用“*”间接引用指针

“*”运算符用于间接引用指针,其结果是一个值,它的类型与该指针的类型一致。间接引用是用内存引用来实现的,要么是存储到一个指定的地址,要么是从指定的地址读取。

5、数组与指针紧密联系

一个数组的名字可以像一个指针变量一样引用(但不能修改)。数组引用(a[3])与指针间接引用(*(a+3))有一样的效果。

数组引用和指针运算都需要用对象大小对偏移量进行伸缩。如表达式 p+i,这里的指针p的值为p,得到的地址计算为 p+L*i,这里的L是与p相关联的数据类型的大小。

6、指针的类型转换改变指针运算的伸缩

将指针从一种类型强制转换成另一种类型,只改变它的类型,而不改变它的值。强制类型转换的一个效果是改变指针运算的伸缩。

比如p是一个char *类型的指针,它的值为p,那么(int *)(p+7)的结果为 p+7,而(int *)p+7的计算结果为p+28。

PS:强制类型转换的优先级高于加法。

7、指针也可以指向函数

这里指针提供了一个强大的存储和向代码传递引用的功能,这些引用可以被程序的其他部分调用。

比如有一个函数定义如下:

int fun(int x, int*p);

然后可以声明一个指针fp,将它赋值给这个函数,

int (*fp)(int,int *);

fp = fun;

然后就可以用这个指针来调用这个函数:

int y = 1;

int result = fp(3, &y);

函数指针的值是该函数机器代码表示中第一条指令的地址。

函数指针声明的语法对新手程序员比较难以理解,对于以下声明:

int (*f)(int*);

要从里往外读,即从(*f)开始,f是一个指针,而(*f)(int *)表明f是一个指向函数的指针,这个函数以一个 int *作为参数。最后我们看到,它是指向以 int *为参数并返回int的函数的指针。



Tags:C语言 指针   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
指针和多维数组有什么关系?为什么要了解它们的关系?处理多维数组的函数要用到指针,所以在使用这种函数之前,先要更深入地学习指针。至于第1个问题,我们通过几个示例来回答。为简...【详细内容】
2020-07-26  Tags: C语言 指针  点击:(78)  评论:(0)  加入收藏
指针对于C来说太重要。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识。所以本文尽可能的通过一篇文章完全讲解指针。...【详细内容】
2020-02-27  Tags: C语言 指针  点击:(67)  评论:(0)  加入收藏
指针在C语言中是一块很重要的内容,也是比较难理解的一块内容,我们需要反复理解反复巩固才可以对其有所了解。之前也分享过指针相关的笔记,但是都比较杂,本篇笔记汇总一下指针相...【详细内容】
2020-01-30  Tags: C语言 指针  点击:(56)  评论:(0)  加入收藏
在程序中声明变量后,编译器就会为该变量分配相应的内存单元。也就是说,每个变量在内存会有固定的位置,有具体的地址。由于变量的数据类型不同,它所占的内存单元数也不相同。如下...【详细内容】
2019-08-19  Tags: C语言 指针  点击:(260)  评论:(0)  加入收藏
指针是C语言的一个核心特色,它以一种统一方式对不同数据结构中的元素产生引用。对于新手来说,指针总是会带来很多困惑,但其实指针的基本概念非常简单。下面是一些指针和它们映...【详细内容】
2019-07-31  Tags: C语言 指针  点击:(255)  评论:(0)  加入收藏
▌简易百科推荐
一、简介很多时候我们都需要用到一些验证的方法,有时候需要用正则表达式校验数据时,往往需要到网上找很久,结果找到的还不是很符合自己想要的。所以我把自己整理的校验帮助类分...【详细内容】
2021-12-27  中年农码工    Tags:C#   点击:(2)  评论:(0)  加入收藏
引言在学习C语言或者其他编程语言的时候,我们编写的一个程序代码,基本都是在屏幕上打印出 hello world ,开始步入编程世(深)界(坑)的。C 语言版本的 hello world 代码:#include <std...【详细内容】
2021-12-21  一起学嵌入式    Tags:C 语言   点击:(11)  评论:(0)  加入收藏
读取SQLite数据库,就是读取一个路径\\192.168.100.**\position\db.sqlite下的文件<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/...【详细内容】
2021-12-16  今朝我的奋斗    Tags:c#   点击:(21)  评论:(0)  加入收藏
什么是shellshell是c语言编写的程序,它在用户和操作系统之间架起了一座桥梁,用户可以通过这个桥梁访问操作系统内核服务。 它既是一种命令语言,同时也是一种程序设计语言,你可以...【详细内容】
2021-12-16  梦回故里归来    Tags:shell脚本   点击:(18)  评论:(0)  加入收藏
一、编程语言1.根据熟悉的语言,谈谈两种语言的区别?主要浅谈下C/C++和PHP语言的区别:1)PHP弱类型语言,一种脚本语言,对数据的类型不要求过多,较多的应用于Web应用开发,现在好多互...【详细内容】
2021-12-15  linux上的码农    Tags:c/c++   点击:(17)  评论:(0)  加入收藏
1.字符串数组+初始化char s1[]="array"; //字符数组char s2[6]="array"; //数组长度=字符串长度+1,因为字符串末尾会自动添&lsquo;\0&lsquo;printf("%s,%c\n",s1,s2[2]);...【详细内容】
2021-12-08  灯-灯灯    Tags:C语言   点击:(47)  评论:(0)  加入收藏
函数调用约定(Calling Convention),是一个重要的基础概念,用来规定调用者和被调用者是如何传递参数的,既调用者如何将参数按照什么样的规范传递给被调用者。在参数传递中,有两个很...【详细内容】
2021-11-30  小智雅汇    Tags:函数   点击:(19)  评论:(0)  加入收藏
一、问题提出问题:把m个苹果放入n个盘子中,允许有的盘子为空,共有多少种方法?注:5,1,1和1 5 1属同一种方法m,n均小于10二、算法分析设f(m,n) 为m个苹果,n个盘子的放法数目,则先对...【详细内容】
2021-11-17  C语言编程    Tags:C语言   点击:(49)  评论:(0)  加入收藏
一、为什么需要使用内存池在C/C++中我们通常使用malloc,free或new,delete来动态分配内存。一方面,因为这些函数涉及到了系统调用,所以频繁的调用必然会导致程序性能的损耗;另一...【详细内容】
2021-11-17  深度Linux    Tags:C++   点击:(38)  评论:(0)  加入收藏
OpenCV(Open Source Computer Vision Library)是一个(开源免费)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android、ios等操作系统上,它轻量级而且高效---由一系列...【详细内容】
2021-11-11  zls315    Tags:C#   点击:(50)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条