论文部分内容阅读
[摘要]C语言中的指针概念比较复杂,但使用时很灵活。正确而灵活地运用指针可以有效地表示复杂的数据结构;能动态分配内存;有效而方便地使用数组等。从五个方面介绍指针。
[关键词]算术运算 运算符&和* 指针表达式 指针和数组
中图分类号:TP3文献标识码:A 文章编号:1671-7597(2008)0310036-01
一、指针的概念
指针是一个特殊的变量,它的值是内存的一个地址。要理解指针需要理解三方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区。下面举例说明。例一:
(1)int*ptr;(2)char*ptr;(3)int(*ptr)[3];(4)int * (*ptr)[4];
(一)指针的类型
从语法的角度看,把指针声明语句里的指针名去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。例一中各指针的类型如下:
(1)int*ptr;/*指针的类型是int* */ (2)char*ptr;/*指针的类型是char* */(3)int(*ptr)[3];/*指针的类型是int(*)[3]*/(4)int*(*ptr)[4];/* 指针的类型是int*(*)[4]*/
(二)指针所指向的类型
当通过指针来访问指针所指向的内存区时,指针所指向的内存区存储的数据的类型即为指针所指向的类型。
从语法的角度看,把指针声明语句里的指针名和名字左边的指针声明符*去掉,剩下的部分就是这个指针所指向的类型。例一中指针所指向的类型如下:
(1)int*ptr;/* 指针所指向的类型是int */ (2)char*ptr;/*指针所指向的类型是char */(3)int(*ptr)[3];/* 指针所指向的类型是int()[3]*/ (4)int*(*ptr)[4];/* 指针所指向的类型是int*()[4]*/
(三)指针的值
指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一般的数值。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。如果一个指针的值是XX,就相当于该指针指向了以XX为首地址的一片内存区域。
二、指针的算术运算
指针可以加上或减去一个整数,这和C语言中的算术表达式意义是不同的。例二:
(1)int a[20];(2)int *ptr=a;(3)………(4)ptr++;
在上例中,指针ptr的类型是int *,它指向的类型是int,它被初始化为指向数组a的起始地址,接下来的第4句中,指针ptr被加了1,编译器编译程序时把指针ptr的值加上了sizeof(int)。
由于int型在32位机中的长度是四个字节,故原来ptr指向数组第0号单元开始的四个字节,此时指向数组从第4号单元开始的四个字节。
三、运算符&和*
&是取地址运算符,*是指针运算符或称为间接访问运算符。&a的运算结果是一个地址,即变量a 的地址。*p为指针变量p所指向的存储单元的内容,即p所指向的变量的值。下面举例说明。例三:
int a=12;
int b;
int * p;
int * * ptr;
p=&a;/* 把变量a的地址赋给指针变量p。 */
*p=24; /* 把24赋给指针变量p所指向的存储单元的内容。*/
ptr=&p; /*把指针变量p的地址赋给指针变量ptr。*/
*ptr=&b;/*把变量b的地址赋给指针变量ptr。 */
* *ptr=34; /**ptr的结果是ptr所指向的存储单元的内容,即变量b的地址,再做一次*运算,结果就是一个int类型的变量。*/
四、指针表达式
如果一个表达式的最后结果是一个指针,那么这个表达式就叫指针表达式。举例如下:例四:
int a,b;
int array[10];
int * pa;
pa=&a;
int * * ptr=&pa;
*ptr=&b;
pa=array;
pa++; /* &a,&pa,*ptr,&b,pa++都是指针表达式。 */
由于指针表达式的结果是一个指针,所以指针表达式也具有指针所具有的三个要素。当一个指针表达式的结果指针已经明确地具有了指针自身所占的内存的时,这个指针表达式就是一个左值,否则不是。
五、指针和数组的关系
数组的数组名实际上是数组的起始地址,所以数组名可以看作是一个指针。举例如下:例五:
int array[10]={0,1,2,3,4,5,6,7,8,9},value;
... ...
value=array[0];/* 也可写成:value=*array;*/
value=array[3];/* 也可写成:value=*(array+3);*/
上例中若把array看作指针,则它指向了array[0]的地址。例中array+3是一个指向数组元素array[3]的地址。
总之,若声明一个数组TYPE array[n],则数组名array有两重含义:第一,它代表整个数组,它的类型是TYPE[n];第二,它是一个指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组元素的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,它和数组第0号单元所占用的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的。
六、结语
指针是C语言中的一个重要概念,也是C语言的一个重要特色。掌握指针的应用,可以使程序简洁、紧凑、高效。每个学习和使用C语言的人,都应当多思考、多上机,在实践中深入地学习和掌握指针。
参考文献:
[1]潭浩强,C程序设计.北京:清华大学出版社. 2005.7.
[2]洪维恩,C程序设计.北京:中国铁道出版社. 2003.11.
[关键词]算术运算 运算符&和* 指针表达式 指针和数组
中图分类号:TP3文献标识码:A 文章编号:1671-7597(2008)0310036-01
一、指针的概念
指针是一个特殊的变量,它的值是内存的一个地址。要理解指针需要理解三方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区。下面举例说明。例一:
(1)int*ptr;(2)char*ptr;(3)int(*ptr)[3];(4)int * (*ptr)[4];
(一)指针的类型
从语法的角度看,把指针声明语句里的指针名去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。例一中各指针的类型如下:
(1)int*ptr;/*指针的类型是int* */ (2)char*ptr;/*指针的类型是char* */(3)int(*ptr)[3];/*指针的类型是int(*)[3]*/(4)int*(*ptr)[4];/* 指针的类型是int*(*)[4]*/
(二)指针所指向的类型
当通过指针来访问指针所指向的内存区时,指针所指向的内存区存储的数据的类型即为指针所指向的类型。
从语法的角度看,把指针声明语句里的指针名和名字左边的指针声明符*去掉,剩下的部分就是这个指针所指向的类型。例一中指针所指向的类型如下:
(1)int*ptr;/* 指针所指向的类型是int */ (2)char*ptr;/*指针所指向的类型是char */(3)int(*ptr)[3];/* 指针所指向的类型是int()[3]*/ (4)int*(*ptr)[4];/* 指针所指向的类型是int*()[4]*/
(三)指针的值
指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一般的数值。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。如果一个指针的值是XX,就相当于该指针指向了以XX为首地址的一片内存区域。
二、指针的算术运算
指针可以加上或减去一个整数,这和C语言中的算术表达式意义是不同的。例二:
(1)int a[20];(2)int *ptr=a;(3)………(4)ptr++;
在上例中,指针ptr的类型是int *,它指向的类型是int,它被初始化为指向数组a的起始地址,接下来的第4句中,指针ptr被加了1,编译器编译程序时把指针ptr的值加上了sizeof(int)。
由于int型在32位机中的长度是四个字节,故原来ptr指向数组第0号单元开始的四个字节,此时指向数组从第4号单元开始的四个字节。
三、运算符&和*
&是取地址运算符,*是指针运算符或称为间接访问运算符。&a的运算结果是一个地址,即变量a 的地址。*p为指针变量p所指向的存储单元的内容,即p所指向的变量的值。下面举例说明。例三:
int a=12;
int b;
int * p;
int * * ptr;
p=&a;/* 把变量a的地址赋给指针变量p。 */
*p=24; /* 把24赋给指针变量p所指向的存储单元的内容。*/
ptr=&p; /*把指针变量p的地址赋给指针变量ptr。*/
*ptr=&b;/*把变量b的地址赋给指针变量ptr。 */
* *ptr=34; /**ptr的结果是ptr所指向的存储单元的内容,即变量b的地址,再做一次*运算,结果就是一个int类型的变量。*/
四、指针表达式
如果一个表达式的最后结果是一个指针,那么这个表达式就叫指针表达式。举例如下:例四:
int a,b;
int array[10];
int * pa;
pa=&a;
int * * ptr=&pa;
*ptr=&b;
pa=array;
pa++; /* &a,&pa,*ptr,&b,pa++都是指针表达式。 */
由于指针表达式的结果是一个指针,所以指针表达式也具有指针所具有的三个要素。当一个指针表达式的结果指针已经明确地具有了指针自身所占的内存的时,这个指针表达式就是一个左值,否则不是。
五、指针和数组的关系
数组的数组名实际上是数组的起始地址,所以数组名可以看作是一个指针。举例如下:例五:
int array[10]={0,1,2,3,4,5,6,7,8,9},value;
... ...
value=array[0];/* 也可写成:value=*array;*/
value=array[3];/* 也可写成:value=*(array+3);*/
上例中若把array看作指针,则它指向了array[0]的地址。例中array+3是一个指向数组元素array[3]的地址。
总之,若声明一个数组TYPE array[n],则数组名array有两重含义:第一,它代表整个数组,它的类型是TYPE[n];第二,它是一个指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组元素的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,它和数组第0号单元所占用的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的。
六、结语
指针是C语言中的一个重要概念,也是C语言的一个重要特色。掌握指针的应用,可以使程序简洁、紧凑、高效。每个学习和使用C语言的人,都应当多思考、多上机,在实践中深入地学习和掌握指针。
参考文献:
[1]潭浩强,C程序设计.北京:清华大学出版社. 2005.7.
[2]洪维恩,C程序设计.北京:中国铁道出版社. 2003.11.