- 浏览: 134665 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (130)
- java基础 (9)
- java高级 (19)
- struts2.x (2)
- spring (1)
- hibernate (1)
- jpa (1)
- ibatis (2)
- javascript (4)
- jsp (2)
- sql (9)
- oracle (12)
- extjs (0)
- uml (0)
- 关于面试 (4)
- 常用软件晋级 (5)
- 网络编程 (1)
- XML (1)
- servlet (5)
- jquery (6)
- Tomcat (3)
- Android (17)
- ssl (1)
- c 指针 (0)
- c/c++/oc (3)
- ios (7)
- 设计模式 (0)
- 终端命令 mac (2)
- sqlite3 (1)
- linux (7)
- hadoop (2)
- 特效 (3)
- 架构之路 (2)
- p2p (1)
- 常见问题 (0)
- html (1)
最新评论
-
zaocha321:
建议改一下文章中的错别字。
多线程(二) -
shamusoft:
在iPhone上是采用sqlite进行数据存储是我一种比较习惯 ...
sqlite3 相关操作 -
bear1122ccc:
这是给学习IOS的人打气呀。顶下。
初学ios -
shamusoft:
<Connector className="o ...
SSL协议(HTTPS) 握手、工作流程详解(双向HTTPS流程) -
shamusoft:
去掉拖动ListView带有的黑色背景: and ...
关于加密
C语言中的精华是什么,答曰指针,这也是C语言中唯一的难点。
C是对底层操作非常方便的语言,而底层操作中用到最多的就是指针,以后从事嵌入式开发的朋友们,指针将陪伴我们终身。
本文将从八个常见的方面来透视C语言中的指针,当然,还有其他没有具体提到的方面,像指针表达式、指针安全等问题,以后有机会我再慢慢补充。
还是那句老话,重要的是实践,多写代码,才是学好C语言的关键。
1.指针类型分析
分析指针,可以从变量名处起,根据运算符优先级结合,一步一步分析.
int p; //这是一个普通的整型变量
int *p; //首先从P处开始,先与*结合,所以说明P是一个指针,然后再与int结合,说明指针所指向的内容的类型为int 型.所以 P是一个返回整型数据的指针
int p[3]; //首先从P处开始,先与[]结合,说明P 是一个数组,然后与int结合,说明数组里的元素是整型的,所以 P是一个由整型数据组成的数组
int *p[3]; //首先从P处开始,先与[]结合,因为其优先级比*高,所以P是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与 int结合,说明指针所指向的内容的类型是整型的,所以是一个由返回整型数据的指针所组成的数组
int (*p)[3]; //首先从P处开始,先与*结合,说明P是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P是一个指向由整型数据组成的数组的指针
int **p; //首先从 P开始,先与*结合,说明P是一个指针,然后再与*结合,说明指针所指向的元素是指针,然后再与 int结合,说明该指针所指向的元素是整型数据. 所以P是一个返回指向整型数据的指针的指针
int p(int); //从P处起,先与()结合,说明P是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数然后再与外面的int 结合,说明函数的返回值是一个整型数据.所以P是一个有整型参数且返回类型为整型的函数
int (*p)(int); //从P处开始,先与指针结合,说明P是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int 结合,说明函数有一个int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型,所以P是一个指向有一个整型参数且返回类型为整型的函数的指针
int *(*p(int))[3]; //从 P开始,先与()结合,说明P是一个函数,然后进入()里面,与int结合,说明函数有一个整型变量参数,然后再与外面的*结合,说明函数返回的是一个指针,,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的元素是指针,然后再与int 结合,说明指针指向的内容是整型数据.所以P是一个参数为一个整数且返回一个指向由整型指针变量组成的数组的指针变量的函数
2.指针分析
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。
指针的类型:把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型
指针所指向的类型:把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型(在指针的算术运算中,指针所指向的类型有很大的作用)
指针所指向的内存区:从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。(一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址)
指针本身所占据的内存区:用函数sizeof(指针的类型)可以测出指针本身所占据的内存区(在 32位平台里,指针本身占据了 4个字节的长度)
3.指针的算术运算
指针和整数进行加减:一个指针 ptrold加(减)一个整数 n后,结果是一个新的指针ptrnew,ptrnew 的类型和 ptrold 的类型相同,ptrnew 所指向的类型和 ptrold所指向的类型也相同,ptrnew的值将比 ptrold 的值增加(减少)了n乘sizeof(ptrold所指向的类型)个字节。
指针和指针进行加减:两个指针不能进行加法运算,这是非法操作;两个指针可以进行减法操作,但必须类型相同,一般用在数组方面。
4. 运算符&和*
&是取地址运算符,*是间接运算符。
&a的运算结果是一个指针,指针的类型是a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a的地址。
*p的运算结果就五花八门了,总之*p 的结果是 p 所指向的东西,这个东西有这些特点:它的类型是 p指向的类型,它所占用的地址是p所指向的地址。
5. 数组和指针的关系
数组的数组名其实可以看作一个指针。
声明了一个数组 TYPE array[n],则数组名称array就有了两重含义:
第一,它代表整个数组,它的类型是 TYPE[n];
第二 ,它是一个常量指针,该指针的类型是TYPE*,该指针指向的类型是 TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。该指针的值是不能修改的,即类似 array++的表达式是错误的。
6. 指针和结构类型的关系
假设我们定义了一个结构体,struct MyStruct{inta;int b;int c;};
同时定义结构体的结构对象并初始化,struct MyStructss={20,30,40};
那么我们如何通过指针ptr 来访问 ss的三个成员变量呢?
答案就是,我们先定义一个指向结构对象 ss的指针,struct MyStruct *ptr=&ss; 然后,使用指向运算符->便可实现对结构对象ss成员的访问。
ptr->a; //或者可以这们(*ptr).a,建议使用前者
ptr->b;
ptr->c;
7. 指针和函数的关系
可以把一个指针声明成为一个指向函数的指针,从而通过函数指针调用函数。让我们举一个例子来说明以下吧。
int fun(char *,int);
int (*pfun)(char *,int);
pfun=fun;
int a=(*pfun)("abcdefg",7);
例中,定义了一个指向函数fun的指针pfun,把pfun作为函数的形参。把指针表达式作为实参,从而实现了对函数fun的调用。
8. 指针类型转换
当我们初始化一个指针或给一个指针赋值时,赋值号的左边是一个指针,赋值号的右边是一个指针表达式,这就要求两边的类型一致,所指向的类型也一致,如果不一致的话,需要进行强制类型转换。语法格式是:(TYPE *)p;
这样强制类型转换的结果是一个新指针,该新指针的类型是TYPE *,它指向的类型是TYPE,它指向的地址就是原指针指向的地址。要注意的是,原来的指针p的一切属性都没有被修改。
另外,一个函数如果使用了指针作为形参, 那么在函数调用语句的实参和形参的结合过程中,也必须保证类型一致 ,否则需要强制转换。
注:是位大师总结的文章,具体名号网链地址没找到。
C是对底层操作非常方便的语言,而底层操作中用到最多的就是指针,以后从事嵌入式开发的朋友们,指针将陪伴我们终身。
本文将从八个常见的方面来透视C语言中的指针,当然,还有其他没有具体提到的方面,像指针表达式、指针安全等问题,以后有机会我再慢慢补充。
还是那句老话,重要的是实践,多写代码,才是学好C语言的关键。
1.指针类型分析
分析指针,可以从变量名处起,根据运算符优先级结合,一步一步分析.
int p; //这是一个普通的整型变量
int *p; //首先从P处开始,先与*结合,所以说明P是一个指针,然后再与int结合,说明指针所指向的内容的类型为int 型.所以 P是一个返回整型数据的指针
int p[3]; //首先从P处开始,先与[]结合,说明P 是一个数组,然后与int结合,说明数组里的元素是整型的,所以 P是一个由整型数据组成的数组
int *p[3]; //首先从P处开始,先与[]结合,因为其优先级比*高,所以P是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与 int结合,说明指针所指向的内容的类型是整型的,所以是一个由返回整型数据的指针所组成的数组
int (*p)[3]; //首先从P处开始,先与*结合,说明P是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P是一个指向由整型数据组成的数组的指针
int **p; //首先从 P开始,先与*结合,说明P是一个指针,然后再与*结合,说明指针所指向的元素是指针,然后再与 int结合,说明该指针所指向的元素是整型数据. 所以P是一个返回指向整型数据的指针的指针
int p(int); //从P处起,先与()结合,说明P是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数然后再与外面的int 结合,说明函数的返回值是一个整型数据.所以P是一个有整型参数且返回类型为整型的函数
int (*p)(int); //从P处开始,先与指针结合,说明P是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int 结合,说明函数有一个int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型,所以P是一个指向有一个整型参数且返回类型为整型的函数的指针
int *(*p(int))[3]; //从 P开始,先与()结合,说明P是一个函数,然后进入()里面,与int结合,说明函数有一个整型变量参数,然后再与外面的*结合,说明函数返回的是一个指针,,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的元素是指针,然后再与int 结合,说明指针指向的内容是整型数据.所以P是一个参数为一个整数且返回一个指向由整型指针变量组成的数组的指针变量的函数
2.指针分析
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。
指针的类型:把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型
指针所指向的类型:把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型(在指针的算术运算中,指针所指向的类型有很大的作用)
指针所指向的内存区:从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。(一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址)
指针本身所占据的内存区:用函数sizeof(指针的类型)可以测出指针本身所占据的内存区(在 32位平台里,指针本身占据了 4个字节的长度)
3.指针的算术运算
指针和整数进行加减:一个指针 ptrold加(减)一个整数 n后,结果是一个新的指针ptrnew,ptrnew 的类型和 ptrold 的类型相同,ptrnew 所指向的类型和 ptrold所指向的类型也相同,ptrnew的值将比 ptrold 的值增加(减少)了n乘sizeof(ptrold所指向的类型)个字节。
指针和指针进行加减:两个指针不能进行加法运算,这是非法操作;两个指针可以进行减法操作,但必须类型相同,一般用在数组方面。
4. 运算符&和*
&是取地址运算符,*是间接运算符。
&a的运算结果是一个指针,指针的类型是a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a的地址。
*p的运算结果就五花八门了,总之*p 的结果是 p 所指向的东西,这个东西有这些特点:它的类型是 p指向的类型,它所占用的地址是p所指向的地址。
5. 数组和指针的关系
数组的数组名其实可以看作一个指针。
声明了一个数组 TYPE array[n],则数组名称array就有了两重含义:
第一,它代表整个数组,它的类型是 TYPE[n];
第二 ,它是一个常量指针,该指针的类型是TYPE*,该指针指向的类型是 TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。该指针的值是不能修改的,即类似 array++的表达式是错误的。
6. 指针和结构类型的关系
假设我们定义了一个结构体,struct MyStruct{inta;int b;int c;};
同时定义结构体的结构对象并初始化,struct MyStructss={20,30,40};
那么我们如何通过指针ptr 来访问 ss的三个成员变量呢?
答案就是,我们先定义一个指向结构对象 ss的指针,struct MyStruct *ptr=&ss; 然后,使用指向运算符->便可实现对结构对象ss成员的访问。
ptr->a; //或者可以这们(*ptr).a,建议使用前者
ptr->b;
ptr->c;
7. 指针和函数的关系
可以把一个指针声明成为一个指向函数的指针,从而通过函数指针调用函数。让我们举一个例子来说明以下吧。
int fun(char *,int);
int (*pfun)(char *,int);
pfun=fun;
int a=(*pfun)("abcdefg",7);
例中,定义了一个指向函数fun的指针pfun,把pfun作为函数的形参。把指针表达式作为实参,从而实现了对函数fun的调用。
8. 指针类型转换
当我们初始化一个指针或给一个指针赋值时,赋值号的左边是一个指针,赋值号的右边是一个指针表达式,这就要求两边的类型一致,所指向的类型也一致,如果不一致的话,需要进行强制类型转换。语法格式是:(TYPE *)p;
这样强制类型转换的结果是一个新指针,该新指针的类型是TYPE *,它指向的类型是TYPE,它指向的地址就是原指针指向的地址。要注意的是,原来的指针p的一切属性都没有被修改。
另外,一个函数如果使用了指针作为形参, 那么在函数调用语句的实参和形参的结合过程中,也必须保证类型一致 ,否则需要强制转换。
注:是位大师总结的文章,具体名号网链地址没找到。
发表评论
-
maven 学习参考文章
2015-02-10 09:06 559maven环境快速搭建 http://www.cn ... -
用struts 包控制权限的文章
2015-01-09 09:23 584http://www.cnblogs.com/Johness/ ... -
IE 兼容模式 quirks 网页变形
2014-11-27 23:14 675http://www.cnblogs.com/0000/ar ... -
oracle 日期操作
2014-10-16 16:53 638Oracle 获取当前日期及日期格式 获取系统日期: ... -
freemark hellword
2014-09-11 20:32 9471、所需的材料: 主料: myeclipse(我用的版 ... -
学习FreeMaker
2014-04-10 16:41 617原文地址 :http://tailshe ... -
JSONOBJ 转换对象
2013-12-22 13:13 999import java.lang.reflect.Field ... -
p2p 企业信贷 UML 跨行清算
2013-12-07 23:09 619p2p 银行业务 http://blog.csdn.net ... -
glassfish 集群
2013-12-05 14:35 750感谢猫咪文章,在此做 ... -
随手记 objective-c(一)
2012-03-14 08:51 907名词解释: Cocoa Mac操作系统上的开发环境统称。 ... -
初学ios
2012-03-05 15:07 1267听一个朋友自学了ios,所以自己也在业余之际买了两本io ... -
本地域名解析操作步骤:
2012-02-22 09:40 01.打开C:\WINDOWS\system32\drive ... -
SSL协议(HTTPS) 握手、工作流程详解(双向HTTPS流程)
2012-02-14 08:57 1590SSL协议的工作流程: ... -
android httpclient https 单向连接tomcat
2012-02-08 17:01 1683双向篇还未实现,先记录单向验证方式。? 一 Android直接 ... -
关于加密
2011-12-27 14:01 985keytool -genkey -alias shamusof ... -
jdk1.5新特性 增强for循环
2011-06-03 06:52 843[code="java"] ... -
用反射实现通用Dao
2011-05-26 16:56 1432public class MySession { /** ... -
反射泛型注解
2011-05-26 07:47 1643一、反射 1. 一段java代码在程序运行期间会经历三个阶段 ... -
代理实现过滤器例子
2011-05-26 07:29 919package cn.itcast.proxy; imp ... -
动态代理 测试代码
2011-05-26 06:25 709import java.lang.reflect.Constr ...
相关推荐
C语言指针练习填空和阅读程序题 本资源主要涵盖了C语言指针的相关知识点,包括指针的基本概念、指针运算、指针与数组的关系、指针与字符串的关系等。通过本资源的学习,可以帮助读者更好地理解和掌握C语言指针的...
c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针...
"彻底搞定C语言指针" C语言指针是C语言中一个非常重要的概念,但它却是初学者最容易迷惑和混淆的部分。要真正搞定C语言指针,需要深入理解C语言变量的存储实质和内存空间的概念。 1. 变量的存储实质 内存空间可以...
本文将介绍C语言指针的基本概念、定义、初始化、运算以及与一维数组的关系。 首先,我们要理解内存地址的概念。在程序运行时,操作系统为代码和数据分配内存空间,每一个内存单元都有一个唯一的编号,称为内存地址...
C语言指针函数和函数指针详细介绍 C语言中指针函数和函数指针是两个不同的概念,但它们之间存在着紧密的联系。本文将对C语言中的指针函数和函数指针进行详细的介绍。 一、指针函数 指针函数是指返回值为指针的...
c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 ...
【C语言指针课程PPT】讲解了C语言中核心的指针概念,它是C语言高效编程的关键。指针允许程序直接访问内存地址,增强了代码的灵活性和性能。以下是关于指针的详细知识点: 1. **变量与内存地址**: - 当在C语言中...
C语言指针详解 C语言指针是一种关键的数据类型,想要学好C语言就必须掌握指针的用法。本篇文章将详细介绍C语言指针的基本概念、指针的声明和使用、数组指针的加减运算、指针之间的运算、指针之间的大小比较、数组...
在探讨C语言指针与汇编语言间接寻址的关系时,我们从存储空间图的视角出发,这不仅能帮助我们更直观地理解这两种编程语言中数据访问机制的本质,还能揭示它们之间深层次的联系。 ### 存储空间图的概念 存储空间图...
《指针详解——C语言指针完全解析》 在C语言的世界中,指针是一个强大的工具,也是理解和掌握C语言的关键。本文将深入探讨指针的概念、类型、运算及其在笔试中的重要性。 首先,我们要了解什么是指针。指针是一个...
本节将针对“C语言指针”的进阶学习进行详细阐述。 首先,指针的本质是一个存储内存地址的变量。当你创建一个变量时,系统会在内存中为该变量分配一块空间,而指针就是保存这块空间地址的变量。在C语言中,声明指针...
本教程《C语言指针详细讲解》深入探讨了指针的使用,包括指针与数组、指针与字符串以及指针与函数的交互。 首先,我们来看指针的概念。在C语言中,每当我们声明一个变量,系统就会在内存中为这个变量分配一块空间,...
通过深入学习这些知识点,你将能够熟练地运用C语言指针进行高效的编程,解决复杂的算法问题,并构建自己的数据结构。提供的《C和指针》PDF文档将为你提供详细的解释和实例,加深对这些概念的理解。
《C语言指针经验总结》PDF是一份深入探讨C语言指针使用技巧和实践经验的文档。C语言中的指针是其强大特性的核心之一,它允许程序员直接操作内存,实现高效的数据处理和灵活的程序设计。这份资料通过实例和经验分享,...
在C语言中,指针是其核心特性之一,也是许多高级功能实现的基础。指针能够直接存储内存地址,使得...通过《C语言指针详解》这样的资料,你可以系统地学习和巩固这些知识,消除对指针的畏惧,成为一名更出色的C程序员。
"精选C语言指针资料大全"集合了多种资源,旨在帮助初学者和深入研究者更好地理解和掌握这一核心概念。以下是对这些资源中可能包含的知识点的详细解释。 1. **C指针宝典**: - 指针基础:理解指针是什么,如何声明...
C语言指针题库 本资源摘要信息是关于C语言指针的题库,涵盖了计算机等级二级考试中的相关内容。该资源包含选择题和编程题,旨在帮助考生和学习者提高C语言指针的知识和技能。 指针基本概念 在C语言中,指针是一种...
《C语言指针学习笔记》 指针是C语言中的一种强大特性,它允许程序员直接操作内存地址,实现高效的数据处理和复杂的程序设计。要掌握指针,我们需要理解其四方面的核心概念:指针的类型、指针所指向的类型、指针的值...
C语言指针题目相关 在本文档中,我们将从多个角度来讨论C语言中的指针概念,并通过实践题目来巩固相关知识。以下是提炼出的知识点: 1. 指针的定义和声明: 在C语言中,指针是指向内存中某个存储单元的变量。指针...