指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:

指针的类型,

指针所指向的 类型,

指针的值或者叫指针所指向的内存区,

还有指针本身所占据的内存区。

让我们分别说明。

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

例一:

(1)int *ptr;

(2)char *ptr;

(3)int **ptr;

(4)int(*ptr)[3];

(5)int*(*ptr)[4];

指针的类型

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

(1)int*ptr;//指针的类型是int*

(2)char*ptr;//指针的类型是char*

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

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

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

怎么样?找出指针的类型的方法是不是很简单?

指针所指向的类型

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

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

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

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

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

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

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

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

指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的 "类型 "这个概念分成 "指针的类型 "和 "指针所指向的类型 "两个概念,是精通指针的关键点之一。我看了不少书,发现有些写得差的书中,就把指针的这两个概念搅在一起了,所以看起书来前后矛盾,越看越糊涂。

指针的值,或者叫指针所指向的内存区或地址

指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。 指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。

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

以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里?

指针本身所占据的内存区

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

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

指针的算术运算

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

例二:

1、char  a[20];

2、int *ptr = a;

...

...

3、ptr++;

在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整形变量a。接下来的第3句中,指针ptr被加了1,编译器是这样处理的:它把指针ptr的值加上了sizeof(int),在32位程序中,是被加上了4。由于地址是用字节做单位的,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。

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

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

int  array[20];

int *ptr = array;

...

//此处略去为整型数组赋值的代码。

...

for(i=0;i <20;i++)

{

(*ptr)++;

ptr++;

}

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

例四:

1、char a[20];

2、int *ptr = a;

...

...

3、ptr += 5;

在这个例子中,ptr被加上了5,编译器是这样处理的:将指针ptr的值加上5乘sizeof(int),在32位程序中就是加上了5乘4=20。由于地址的单位是字节,故现在的ptr所指向的地址比起加5后的ptr所指向的地址来说,向高地址方向移动了20个字节。在这个例子中,没加5前的ptr指向数组a的第0号单元开始的四个字节,加5后,ptr已经指向了数组a的合法范围之外了。虽然这种情况在应用上会出问题,但在语法上却是可以的。这也体现出了指针的灵活性。

C语言中的memset函数和数组指针

代码: #include #include using namespace std; int main(){ ] = {}; mems ...

C-C&plus;&plus;到底支不支持VLA以及两种语言中const的区别

C-C++到底支不支持VLA以及两种语言中const的区别 到底支不支持VLA VLA就是variable-length array,也就是变长数组. 最近写程序的时候无意间发现,gcc中竟然支持下面 ...

C语言中setjmp与longjmp学习笔记

C语言中setjmp与longjmp学习笔记 一.基础介绍 头文件:#include 原型:  int setjmp(jmp_buf envbuf) ,然而longjm ...

C语言中volatile的作用和使用方法

在程序设计中,尤其是在C语言.C++.C#和Java语言中,使用volatile关键字声明的变量或对象通常具有与优化.多线程相关的特殊属性. 通常,volatile关键字用来阻止(伪)编译器认为的无法 ...

C语言中的extern关键字用法

在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”. 1. extern修饰变量的声明.举例来说,如果文件a.c需要引用b.c中变量int v ...

C语言中extern的用法--转

http://blog.sina.com.cn/s/blog_52deb9d50100ml6y.html 在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的, ...

C语言中qsort函数用法

C语言中qsort函数用法-示例分析    本文实例汇总介绍了C语言中qsort函数用法,包括针对各种数据类型参数的排序,非常具有实用价值非常具有实用价值. 分享给大家供大家参考.C语言中的qsort ...

&lbrack;转&rsqb; C&plus;&plus;指针加整数、两个指针相减的问题

http://blog.csdn.net/onlyou930/article/details/6725051 说来惭愧,写C++有一段时间了.这个问题从来没有认真考虑过,此次标记于此: 考虑如下问题: ...

C语言中file文件指针概念及其操作 (转载)

文件 文件的基本概念 所谓"文件"是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名.实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件. ...

随机推荐

http应用优化和加速说明-负载均衡

负载均衡技术       现代企业信息化应用越来越多的采用B/S应用架构来承载企业的关键业务,因此,确保这些任务的可靠运行就变得日益重要.随着越来越多的企业实施数据集中,应用的扩展性.安全性和可靠性也 ...

BestCoder9 1003 Revenge of kNN&lpar;hdu 4995&rpar; 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4995 题目意思:在一个一维坐标轴上,给出位置 xi 和值 vi,对于 M 次询问,每次询问给出inde ...

C&plus;&plus;创建对象的三种方式

C++在创建对象的时候,有三种方式: #include using namespace std; class A { private: int n; public: ...

Oracle执行计划——Oracle 如何启用执行计划

AUTOTRACE是一项SQL*Plus功能,自动跟踪为SQL语句生成一个执行计划并且提供与该语句的处理有关的统计.SQL*Plus AUTOTRACE可以用来替代SQL Trace使用,AUTOTR ...

读写锁的实现原理(pthread&lowbar;rwlock&lowbar;t)

引言 不同的锁之间的语义是不一样的,没有一劳永逸的锁,只有更适合的锁. 如果是同一进程里的不同线程共享读写锁,那么读写锁变量的维护是在进程内部即可.如果是不同进程共享读写锁,那么读写锁变量的维护是在共 ...

Beta版本展示博客

1 团队介绍 团队组成: 齐爽爽(258)个人博客:http://www.cnblogs.com/shuangshuangblog/ 马帅(248)个人博客:http://www.cnblogs.co ...

2018,你与 i 春秋的故事都在这

年终岁末,深思回顾,过去的一年我们共同创造了很多回忆,有欢乐,有感动,更有收获.回首2018年,伴随着激情与挑战,我们共创了很多佳绩,一起来看看吧. 课程&实验 2018新增原创录制实战视频课 ...

FineUI 相关

FineUI 相关(ExtAsp.Net 2008-2017),记在这把,免得找不到了. 不知道同年代的类似项目Coolite怎么样了?更名为Ext.net了,在国外活得还算滋润,在国内嘛..死贵死贵 ...

linux编译内核make menuconfig报错Unable to find the ncurses libraries解决办法

在 linux 编译内核时 make menuconfig 报了下面的错误. *** Unable to find the ncurses libraries or the *** required ...

c语言中变量加1,c语言中,指针加1的情况.指针变量详细介绍相关推荐

  1. c语言中字符 a b =,C语言中(ab)?a:b和(ab)?b:a有什么区别,C语言中,a++ +b和a+ ++b有什么不同...

    导航:网站首页 > C语言中(a>b)?a:b和(a C语言中(a>b)?a:b和(a 匿名网友: "?"在C语言中表示疑问.假如.如果. ":&quo ...

  2. C语言中字母a等于,C语言中’a’和"a"有什么区别?,c语言中“!a"是什么意思啊...

    导航:网站首页 > C语言中'a'和"a"有什么区别?,c语言中"!a"是什么意思啊 C语言中'a'和"a"有什么区别?,c语言中"!a"是什么意思啊 匿名网友: 1.本质区 ...

  3. c语言中的所有关键字,C语言中的32个关键字

    C语言中的32个关键字 数据类型关键字(12个) (1)     char:声明字符型变量或函数 (2)     double:声明双精度变量或函数 (3)     enum:声明美剧类型 (4)   ...

  4. c语言中值程序,编程c语言中,向上取整函数_C编程中的函数

    编程c语言中,向上取整函数 什么是功能? (What is a Function?) A Function is a block of statements that performs a speci ...

  5. 在c语言中通过return语句,c语言中return的用法

    c语言中return的用法 函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过 return语句返回. return 语句的一般形式为:return 表达式; 或者:retu ...

  6. sleep函数的作用c语言,C语言中的sleep函数是什么意思【详细介绍】

    计算机知识:C语言中的Slee函数 Sleep函数简介: 函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned milliseconds); 在V ...

  7. c语言中函数isalpha,isalpha C语言中isalnum()函数和isalpha()函数的对比

    C语言isalnum()函数:判断字符是否为英文字母或数字 头文件: #include isalnum() 用来判断一个字符是否为英文字母或数字,相当于 isalpha(c) || isdigit(c ...

  8. c语言中嵌套循环的作用,C语言中n层循环嵌套实现

    今天听课忽然听到,n阶行列式可以运用按行展开或者按列展开,不断降阶实现,就可以降到三阶行列式,这样就可以计算了.方便用计算机实现.回到寝室,想着把这个程序编出来.编了一个多小时,并没有任何进展,才发现 ...

  9. 为什么c语言中会引入ASCII,C语言中ASCII码是什么意思?

    是一个字符表,一个字节的范围是0-255,每个数可以表示一个字符.计算机都是以1,0编码的,可以先取得二进制对应的10进制,再解析为对应的字符. 但128-255基本上没有被定义,用于以后扩展. 例如 ...

  10. x20在c语言中是什么意思,c语言中\x20和\0都是空格的写法吗?\x20为什么是16进制?新手求解!...

    满意答案 \是转义符 \x20是空格吧 \0是空,表示什么都没有,连空格也没有,不是空格 \x20 后面有跟个X表示是16进制的,这是规定. 1. 一般转义字符 这种转义字符,虽然在形式上由两个字符组 ...

最新文章

  1. 为什么Rust连续4年获“最受喜爱编程语言”?
  2. 业界 | 每天1.4亿小时观看时长,Netflix怎样存储这些时间序列数据?
  3. Rpgmakermv(31)MOG插件与YEP的结合
  4. mysql 评论回复表设计_【数据库】评论回复表设计
  5. 在VS2010里可以给JS函数添加代码提示\注释
  6. Python打包之pyinstaller
  7. oracle 条件查询加排序,Java乔晓松-oracle的条件查询和排序查询
  8. x86的32位汇编快速入门
  9. Matlab功率谱估计
  10. 增强服务器安全性能,加强Linux服务器安全的20项建议
  11. python读写json_python 读写json数据
  12. 免费证书https://lamp.sh/ssl.html
  13. java 构造函数嵌套_java – spring – 构造函数注入和覆盖嵌套bean的父定义
  14. oracle单引号和双引号的区别
  15. 庆祝kkkbo出道!
  16. C++ Json解析库Jsoncpp下载+编译+使用
  17. paypal php 方式,如何使用PHP向paypal汇款
  18. 笔记本搜不到WiFi是什么原因
  19. IP分片、TCP分段
  20. 还不知道如何写文章上热榜吗?听1_bit大佬给你讲讲

热门文章

  1. tungsten-replicator安装
  2. 跨越异构鸿沟,Redis 迁移同步过程中的挑战与解决方案
  3. php代码运行后空白什么原因,PHP空白页面常见原因及解决方法
  4. ESP32 nvs 加密
  5. 3D建模软件大总结,你都知道哪些?
  6. 跟我一起写Shell脚本之十八--常用命令(head)
  7. WordPress 配置七牛云 CDN 具体操作
  8. 如何搭建Telegram群机器人
  9. 漫话:什么是DevOps?
  10. idea+win10+chrome+jAceJump的快捷键使用