指针怎么理解

1、指针的概念

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。分别说明。

先声明几个指针放着做例子:

int *ptr;

char *ptr;

int **ptr;

int (*ptr)[3];

int *(*ptr)[4];

2、指针的类型

从语法的角度看,只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。看看下面各个指针的类型:

int *ptr; //指针的类型是int *

char *ptr; //指针的类型是char *

int **ptr; //指针的类型是 int **

int (*ptr)[3]; //指针的类型是 int(*)[3]

int *(*ptr)[4]; //指针的类型是 int *(*)[4]

3、指针所指向的类型

当通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。从语法上看,只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:

int *ptr; //指针所指向的类型是int

char *ptr; //指针所指向的的类型是char

int **ptr; //指针所指向的的类型是 int *

int (*ptr)[3]; //指针所指向的的类型是 int()[3]

int *(*ptr)[4]; //指针所指向的的类型是 int *()[4]

在指针的算术运算中,指针所指向的类型有很大的作用。

指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当对C越来越熟悉时,会发现,把与指针搅和在一起的“类型”这个概念分成“指针的类型”和“指针所指向的类型”两个概念,是精通指针的关键点之一。

5、指针的值

指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。

指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。

指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。

6、指针本身所占据的内存区

指针本身占了多大的内存;只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据了4个字节的长度。

指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。扩展资料:

指针的算术运算

指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。例如:

例一:

char a[20];

int *ptr=a;

...

...

ptr++;

在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整形变量a。接下来的第3句中,指针ptr被加了1,

编译器是这样处理的:它把指针ptr的值加上了sizeof(int),在32位程序中,是被加上了4。由于地址是用字节做单位的,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。

由于char类型的长度是一个字节,所以,原来ptr是指向数组a的第0号单元开始的四个字节,此时指向了数组a中从第4号单元开始的四个字节。

可以用一个指针和一个循环来遍历一个数组,看例子:

例二:

这个例子将整型数组中各个单元的值加1。由于每次循环都将指针ptr加1,所以每次循环都能访问数组的下一个单元。再看例子:

例三:

char a[20];

int *ptr = a;

...

...

ptr += 5;

在这个例子中,ptr被加上了5,编译器是这样处理的:将指针ptr的值加上5乘sizeof(int),在32位程序中就是加上了5乘4=20。由于地址的单位是字节,故现在的ptr所指向的地址比起加5后的ptr所指向的地址来说。

向高地址方向移动了20个字节。在这个例子中,没加5前的ptr指向数组a的第0号单元开始的四个字节,加5后,ptr已经指向了数组a的合法范围之外了。虽然这种情况在应用上会出问题,但在语法上却是可以的。这也体现出了指针的灵活性。

如果上例中,ptr是被减去5,那么处理过程大同小异,只不过ptr的值是被减去5乘sizeof(int),新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了20个字节。

总结一下,一个指针ptrold加上一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值增加了n乘sizeof(ptrold所指向的类型)个字节。

就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。一个指针ptrold减去一个整数n后,

结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。

ptrnew的值将比ptrold的值减少了n乘sizeof(ptrold所指向的类型)个字节,就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。

参考资料:

百度百科——指针

常量指针和指针常量什么区别

区别:

1、本质

指针常量:本质上一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。

常量指针:本质上是一个指针,常量表示指针指向的内容,说明该指针指向一个“常量”。

2、地址

指针常量:在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。在定义的同时必须初始化。

常量指针:指针可以指向其他地址

3、内容

指针常量:指向的内容可以修改

常量指针:在常量指针中,指针指向的内容是不可改变的,指针看起来好像指向了一个常量。

扩展资料

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。

从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。

当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。

从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。

指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32 位程序里,所有类型的指针的值都是一个32 位整数,因为32 位程序里内存地址全都是32 位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为si zeof(指针所指向的类型)的一片内存区。

在32 位平台里,指针本身占据了4 个字节的长度。指针本身占据的内存这个概念在判断一个指针表达式(后面会解释)是否是左值时很有用。

参考资料:百度百科 - 指针

C语言中“指针”和“指针变量”的区别是什么

1、概念不同

“指针”是概念,“指针变量”是具体实现,指针也是一个变量,所以需要进行定义,而对于指针的定义,与一般变量一样。

2、 存放地址不同

一个变量的(内存)地址称为该变量的“指针”,通过指针能找到以它为地址的内存单元。而指针变量是用来存放另一个变量的地址的(即指针)。

扩展资料:

指针和指针变量的关系

1、指针就是地址,地址就是指针。

2、地址就是内存单元的编号。

3、指针变量就是存放内存地址的变量。

4、指针和指针变量是两个不同的概念,但要注意的是,通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样。

注:

指针里存的是100. 指针:地址 - 具体。

指针里存的是地址,指针:指针变量 -可变。

指针的好处:

1、直接访问硬件

2、快速传递数据(指针表示地址)

3、返回一个以上的值返回一个(数组或者结构体的指针)

4、表示复杂的数据结构(结构体)

5、方便处理字符串

6、指针有助于理解面向对象

指针-什么意思?

意思是通过它能找到以它为地址的内存单元。

由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。

在C中将一种专门表示变量指针(位置)的变量叫做指针变量,指针变量专用来存放地址,其值为指针(地址)。

定义指针变量:类型名 *指针变量名;

指针变量实用举例:

int *p1,*p2; //定义两个指向p1,p2的整型数据指针变量

p1=&a;

p2=&b; //把变量a和b的值的地址赋给指针变量p1,p2

pritf(*p1=%d,*p2=%d,*p1,*p2)

//以十进制输出*p1,*p2所指向的地址所代表的的a,b的值

扩展资料

指针和引用的区别

1、首先,引用不可以为空,但指针可以为空。前面也说过了引用是对象的别名,引用为空——对象都不存在,怎么可能有别名。故定义一个引用的时候,必须初始化。

2、 声明指针是可以不指向任何对象,也正是因为这个原因,使用指针之前必须做判空操作,而引用就不必。

3、 引用不可以改变指向;但是指针可以改变指向,而指向其它对象。

参考资料来源:百度百科-指针

C语言指针**p是什么意思

**p表示p也表示地址,简单的说,这个地址对应的存储单元存储的数也是一个地址,而不是数值,而这个被存储的地址对应的存储单元存储的数据才是真正的相应类型的数值!

例如:

int i=10; //定义了一个整型变量

int *p=&i; //定义了一个指针指向这个变量

int **p1=&p; //定义了一个二级指针指向p指针

那么取出10的值方式为:

printf(“i=[%d]\n”,*p);

printf(“i=[%d]\n”,**p1);

扩展资料:

指针与数组关系

指针数组:就是一个由指针组成的数组,那个数组的各个元素都是指针,指向某个内存地址。char *p[10];//p是一个指针数组

数组指针:数组名本身就是一个指针,指向数组的首地址。注意这是一个常数。

example:

char (*p)[10]//p是一个数组指针

函数指针:本身是一个指针,指向一个函数入口地址,通过该指针可调用其指向的函数,使用函数指针可实现回调函数。

参考资料来源:百度百科-指针

C语言指针**p是什么意思、指针的指针,就介绍到这里啦!感谢大家的阅读!希望能够对大家有所帮助!

对于C语言中的指针**P的理解,C语言指针**p是什么意思相关推荐

  1. c语言中存贮班级学生的变量,C语言----变量教案.docx

    C语言----变量教案 课 题 2.2 常量和变量----变量 课型 理实一体化 授课班级 高二计算机(升学班) 课时 2 教学目标 复习巩固C语言中常量的应用: 掌握C语言中变量的命名规则及应用. ...

  2. c语言中变量加1,c语言中,指针加1的情况.指针变量详细介绍

    指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容: 指针的类型, 指针所指向的 类型, 指针的值或者叫指针所指向的内存区, 还有指针本身所占 ...

  3. c语言中减号算一个字符吗,C语言中指针的加减运算

    char arr[3]; printf("arr:\n%d\n%d\n%d\n", arr, arr + 1, arr + 2); char *parr[3]; printf(&q ...

  4. c语言多维指针,C语言中多维数组和多维数组指针的应用

    最近开始好好学习编写CFD程序了,由于计算过程中所涉及的网格节点较多(一维最容易,二维就比较麻烦了,三维的还没有尝试自己动手编程呢),每个节点上都有若干个参数,包括速度,压力,温度,密度等,并且这些参 ...

  5. asin c语言中 返回值范围_大学C语言考试易错知识点总结

    作者:cggwz 来源:https://blog.csdn.net/cggwz/article/details/103740713?utm_medium=distribute.pc_relevant. ...

  6. c语言中外部变量的使用方法,C语言外部变量的使用以及erxtern的用法

    网上有很多帖子问C语言中extern的用法,而且回答的详细程度各尽不同. 所以我就像写一篇博文来谈谈我对extern的看法,不一定十分恰当,只当大家共勉. 变量定义性声明和引用性声明 变量的声明有两种 ...

  7. C语言中比较大小的函数模板,C语言中实现模板函数小结 : 不敢流泪

    --by boluor 2009/5/20 如果要写个函数支持多种数据类型,首先想到的就是C++的模板了,但是有时候只能用C语言,比如在linux内核开发中,为了减少代码量,或者是某面试官的要求- 考 ...

  8. 在c语言中 函数的作用是什么,C语言程序中函数的定义

    C语言程序中函数的定义 C语言的函数问题是困扰很多学者的问题的,c程序中什么是函数呢?下面啦小编为大家精心推荐的c程序中函数的定义,希望能够对您有所帮助. C语言读书笔记--函数 先来看看函数的一般形 ...

  9. c语言中百分号后面跟的数字_C语言中的各种百分号都代表什么意思

    C语言中的各种百分号都代表什么意思 mip版  关注:259  答案:4  悬赏:60 解决时间 2021-01-27 22:51 已解决 2021-01-27 10:19 比如 d% s%最好能列一 ...

  10. c语言中计算一个字母的序数,C语言编程 输入一串字符统计英文字母的个数

    C语言编程:输入一行字符,至少50个,统计其中英文字母,数字,其他字母个数 楼上那个不能统计空格个数,我这个可以#include#includeintmain(){intcnt_c=0,cnt_n=0 ...

最新文章

  1. 基于半监督学习的单体型组装算法
  2. redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发?...
  3. 哈儿小波分解和重构(降维和升维)实现算法
  4. Win7系统桌面壁纸换不了怎么办
  5. android 底部导航,Android 底部导航之BottomNavigationBar
  6. LINUX操作系统练习题
  7. Android机顶盒烧录方法
  8. jsp技术被淘汰了?那还要不要学它?
  9. 基于公众号扫码授权登录
  10. 你对软件测试了解多少?这篇文章会给你不一样的启示!
  11. ROS(sub,pub)测试 Plotjuggler
  12. 手机微信如何取消“其他应用打开”的默认方式?
  13. Android app本地切换logo和名称
  14. envoy实现_使用Envoy实现一键部署项目
  15. 简历翻译中译英多少钱
  16. 基础C语言知识串串香7☞位操作
  17. 智能电表远红外远程抄表实施方案
  18. 加速出圈的B站:商业化心结何时割
  19. PS笔刷:太空星云特效
  20. 【计算机组成原理】关于1M=1024K 和1M=1000K的主要使用区别

热门文章

  1. 【知识兔】自学Excel之4:窗口视图控制
  2. 如何在机智云开发平台快速创建具有商用租赁效果的硬件产品
  3. 解决linux下无法连接为wifi热点上网
  4. 通过图书编号查询python_基于Python的图书ISBN查询接口调用代码实例
  5. 50个高端大气上档次的管理后台界面模板
  6. 第五章 神经网络和误差逆传播法算法(BP)的推导
  7. python 读取网络位置的文件
  8. 笔记本上网显示连接不到服务器,笔记本无线网络连接不上
  9. 计算机切换用户界面,win7系统登录界面切换用户的方法
  10. 《结对-四则运算出题器-测试过程》