码迷,mamicode.com
首页 > 编程语言 > 详细

zerglurker的C语言教程004——指针初步讲解

时间:2015-06-09 23:46:47      阅读:365      评论:0      收藏:0      [点我收藏+]

标签:c++   c语言   编程   语言   

在上次的教程里面,我提到了指针。

针对指针,这次我将简单的讲讲,后面我还会讲到——那个时候你应该有了相当的基础。

首先,先讲讲指针类型。

任何类型关键字后面加一个*符号,就会变成指针类型。

比如:

char char* 字符指针

int int* 整数指针

doubledouble* 双精度指针

甚至还可以这样:

char*char** 字符指针的指针类型 char*** 字符指针的指针的指针类型…

指针本质上是一个内存地址值,该内存地址上存放的是相关类型的数值。但是void*指针类型例外,它指向的内存地址存放的不是void值。

由于现在的内存都很大,动不动都是上G。为了说明上面的情况,我假设存在一个16字节的内存如下图:

技术分享

图中每个格子代表一字节内存,可以存放8个bit

依据上节教程说的,1个char变量a,它的尺寸大小是1字节。可以放在上面的任意一格,这里我假设放在第一格:

技术分享

即 假如存在这样的情况

char a=‘z‘;

a的值‘z‘存放在第一格

然后char* pa = &a;

这里&运算符表示,取变量a的地址。

那么pa的值一定就是0

如果变量a在第二格,那么pa的值就一定是1

这就是说指针是一个地址值,它是由运行时变量的地址决定的。

由于指针也是一个值,所以指针变量也有长度。

在手机和嵌入式环境上,这个地址值通常是4字节

在PC环境上,这个值会随系统而变化:

windows: xp上是4字节 其他系统中,32位程序中是4字节 64位程序则是8字节

linux系统:ubuntu 一般是6字节(实际上是8字节,只是中间两个字节会做加法,最后合成一个6字节地址,形如:0xffff12345678这样的地址值)

Mac系统:同linux

在部分单片机,例如51单片机,plc单片机中,这个值甚至只有2字节,即只有64k内存寻址范围

在我上面假设的内存环境中,这个值只有半个字节0x0~0xF

既然指针变量是一个值,所以它也在内存中,也有地址。而要记录这个值,可以用一个指向指针的指针。

继续上面的假设

char** ppa = &pa;

技术分享

加入pa的值存放在1的位置

那么ppa就等于1

即pa=0 ppa=1

当然实际上pa不一定会顺序存放在1的位置,也可能在其他位置,视程序实际运行的情况而定。

由于指针记录的是地址值,所以存在一种特别的指针void*

这种指针记录的仅仅是地址值,完全不能说明指向的是什么类型数据的地址。

但是这也有很大的好处,对于那些不关心数据类型的用户,这个指针就非常有用了。

例如下面的系统函数:

void* memset(void* dest,int val,int count);

该函数的作用是将指定的dest位置的内存,填充val,直到填满count字节

该函数不关心指定的dest是什么类型的地址,char的也好,int的也好,double也好,反正我就是往里面填入val,直到填满count字节为止。

所以这种时候,void*指针类型就非常好。

有鉴于此,所有的编译器都会提供一种默认的方便:即任何类型指针都可以转换为void*类型,编译器不会报错

比如

char* pa = &a;

memset(pa,1,1);

编译器不会报错,提示你pa的指针类型不对。而是默默的将其转换为void*类型。


本节主要初步讲解了指针,后面还会继续慢慢深入讲解指针。指针的变化非常多,应用也非常广。


ps:

编译器还会默默的进行下列转换:

charint

shortint

上述的unsigned版 unsigned charunsigned int

zerglurker的C语言教程004——指针初步讲解

标签:c++   c语言   编程   语言   

原文地址:http://blog.csdn.net/zerglurker/article/details/46431233

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!