C语言学习之指针

在谈到指针时,不得不说计算机内存和地址的概念。计算机内存以字节为单位由很多个存储单元组成,每一个存储单元都有一个地址,要访问一个存储单元时,必须要指定这个存储单元的地址。例如:一个1K大小的内存,它的地址范围是从0到1023。

那指针又是什么呢?其实指针和普通变量没有什么区别,在32位计算机中,它存储的是一个32位整型数据,但是它和普通变量不同的是,它存放的数据被当作计算机内存的一个存储单元地址来使用。既然它要存储一个32位整型数据,所以一个指针变量的内存空间就是4字节大小,请记住,所有的指针变量都是4字节大小,因为它要存储一个32位地址。

1. 一级指针

int a = 4;

int* p = &a;

我们定义了一个指针变量p,&符号是取地址运算符,这里取得a变量的地址赋值给了指针变量p,这样我们就说p指向了a。


我们要访问a变量这个存储单元,除了使用a变量直接访问外,还多了一种访问方式,就是使用指向a这个存储单元的指针变量p去间接访问a这个存储单元,称为间接访问。间接访问使用‘*’号运算符。例如,我将a这个存储单元的值修改为123:

*p = 123;

前面分析了一个指针变量其实存储的是一个32位无符号整数,这个值被当多一个内存单元的地址来使用,那么指针变量的类型又是什么呢?前面我们定义了一个指针变量p,是这样定义的:int* p;那么我们就说这个指针变量的类型就是int*,指针变量的类型可以是任何的数据类型加上'*'构成,可以是基本数据类型,也可以是符合数据类型。指针变量的类型对于指针变量本身没有任何意义,不管它是什么类型,它都是4字节大小,都是一个32位无符号整型值。但是对于指针变量所指向的存储单元这个类型就很重要了,如果指针变量的类型是int*,那么指针所指向的存储单元被当作一个int类型数据处理,如果是float*,那么就被当作一个浮点数来处理,所以这个指针变量的类型表示我们以怎样的视觉来看待内存这个世界。

指针变量也可以进行算术运算,如果指针变量p指向一个数组,那么p++表示p指向数组的下一个元素,p += i表示p指向当前元素之后的第i个元素。指针变量的运算和它的类型有关,如果指针变量p它是char*类型的,那么p++运算后p的值加了1,但是如果是int*类型的,p++运算后p值加了4。


2. 二级指针

指针变量也有一个地址,所以也可以用另外一个指针变量来存储这个地址,这样的指针变量我们称为指针的指针。

int a = 4;

int* b = &a;

int** c = &b;


指针变量c的类型是什么呢,c指向b,b指向a,那么c就是指向整型的指针的指针,它的类型就是int**。我们还是可以使用c这个指针变量来间接访问a这个存储单元,还是将a存储单元的之修改为123:

**c = 123;


3. 字符串和指针

c中虽然没有字符串类型,但是它允许有字符串常量,字符串常量是以'\0'结尾。例如:

"Hello World!"就是一个字符串,我们再用sizeof宏去计算这个字符串的长度它是会将这个'\0'计算在内的,但使用使用strlen时则不会,它只会计算出字符串的有效字符数。那么在c中如何去定位一个字符串呢,就需要用到这里的字符指针。例如:

char* message = "Hello World";

这里也只是为字符指针分配了4字节大小的空间,那么字符串是存放在什么地方的呢,它是存放在只读数据区的,也就是说我定义了一个字符串,你不能使用这个指针去修改它的值,例如:

*message = "a";

这样的操作是非法的。但是如果我使用一个字符数组来保存一个字符串,例如:

char message[] = "Hello World";

那么这些字符呢它是存放在栈上的,我们是可以通过去修改它的值的。


posted @ 2012-05-01 23:22  移动应用开发  阅读(331)  评论(0编辑  收藏  举报