c语言 不能用于指针变量运算符,C语言中的指针运算

摘要: 指针是C语言的精华、重点、难点,也是C系列语言的基础。本文介绍了C语言中的指针常量和指针变量的运算规则,以及对数组的访问。

Abstract: The pointer is the essence, focus and difficult of C language which is also the basis of C language Series. This article describes the arithmetic rules of pointer constants and variables in C language, as well as the access to the address.

关键词: 指针;地址;数组;运算

Key words: pointer;address;array;operation

中图分类号:TP312 文献标识码:A 文章编号:1006-4311(2014)11-0214-02

1 绪论

C语言的精华是指针,程序设计的关键也是指针,使用指针的难点是指针的运算。用指针访问数组元素,相对比较抽象,故本文用简单的自然语言予以浅析。

2 指针变量的概念

2.1 内存地址:内存中存储单元的编号 内存中,有众多的存储单元(单位:字节)。为了区分不同单元,必须为每一个单元编号,这个编号就是存储单元的“地址”,就像电话很多,为了区分每一部电话,必须为其编号,该编号就是电话号码。每个单元有且仅有一个惟一的地址。单元中存放数据,注意区分单元的地址与单元中的内容(数据)。

2.2 变量地址:该变量在内存中的起始地址 变量名是单元的外部名字(用户命名),单元号是单元的内部名字(系统命名)如 int x 假设整型变量是2个字节,系统分配的存储单元为 100 和101,则首地址100就是变量x在内存中的地址。

直接访问──直接利用变量的地址进行存取。

如:把“书”送给“张伟”就是直接访问。

间接访问──通过另一变量访问该变量的值。

如:把“书”送给“张伟他哥”就是间接访问,先间访“张伟”,知道他哥的地址,再按此地址送“书”。

2.3 指针变量

指针:即地址,存放地址的变量称为指针变量。

指针变量定义格式:数据类型 *指针变量[, *指针变量2……];

取地址运算的格式: &变量

例如

main()

{int x,*p; /*整形的指针的p单元

P=&x;

X=10;

*p+=20;

Printf(“%d,%d\n”,x,*p);

} 程序运行结果是30,30

3 数组的指针和指向数组的指针变量

3.1 数组的指针 数组元素在内存中连续存放,数组名代表数组首地址,是一个地址常量。

3.2 指向数组的指针变量的定义

例如,int a[10], *p=a(或&a[0]);

或者:int a[10], *p;p=a;

3.3 数组元素的引用

3.3.1 按名存取 有 int a[10],*p=a;定义,则p=a,一个数组,两个名字p和a,访问元素时用a[i]或p[i]。

3.3.2 按地址存取 有 int a[10],*p=a;定义,则:p+i和a+i都是数组元素a[i]的地址,访问元素时用*(p+i)和*(a+i)。按地址存取:*(p+i),*(a+i),按名存取:a[i],p[i]四个是等价关系。

注意:①p+n指向数组的下n个元素,而不是简单地使指针变量p的值+n。编译时为p+n*m。m为一个元素占用的字节数。②指针变量:既然是变量,其值随时在变,必须注意其当前值,否则容易出错。③指向数组的指针变量,可以指向数组以后的任何内存单元,C语言不做越界检查,这些单元不是系统分配的单元,强占资源,易导致死机。④int a[10],*p=a;p++对,a++错,a常量,p变量。

3.3.3 指向数组的指针变量所支持的运算 地址加减数值等于新地址,除此以外运算没有意义,由此得出推论,指针支持的运算有:

算术运算:指针变量±整形数据、指针变量-指针变量=整型数值,该数值表示两指针之间的数据个数,并非地址之差。

关系运算:指针变量 关系运算符 指针变量,表示两个变量值的大小关系,谁在前谁在后。

4 二维数组的指针及其指针变量

4.1 二维数组的指针 有定义语句: int a[3][4];

①从二维数组角度看,数组名a代表数组的起始地址, 是一个以行为单位进行控制的行指针,由一维数组构成的一维数组就是二维数组,a+i是行指针值,指向二维数组的第i行。*(a+i)是列指针值,指向第i行第0列。*(*(a+i)):数组元素a[i][0]的值。用a作指针访问数组元素a[i][j]的格式:*(*(a+i)+j)。②int a[3][4],b[4];由定义可看出,a[i]相当于数组名b,故a[0]、a[1]、a[2]分别表示第0、1、2一维数组的名字。③赋值:行指针变量=二维数组名或行指针变量。

4.2 行指针变量定义格式 数据类型 (*指针变量)[n];

4.3 二维数组元素的访问 int a[5][4],(*P)[4]=a;和int b[4],可以看出,b相当于a[5],第i行的一维数组名是a[i],元素地址±数值=元素地址,行地址±数值=行地址,a+i,a[i],*(a+i)其值相等,但a+i是行地址,a[i],*(a+i) 是元素地址。

①按名存取:a[i][j]或p[i][j]

②按地址存取:(*a[i]+j), *(*(a+i)+j), (*p[i]+j), *(*(p+i)+j)

5 动态数组的实现

静态数组:编译阶段确定数组的大小,运行阶段不能改变数组大小。缺点是事先无法准确确定数组的大小,太小不满足处理需要,太大浪费内存空间。

动态数组:运行阶段,根据实际需要动态确定数组的大小。

在C语言中,可利用内存的申请和释放库函数,以及指向数组的指针变量可当数组名使用的特点,来实现动态数组。如下程序

#include “alloc.h”

#include “stdlib.h”

main()

{ int *p=NULL, count, i,*q;

scanf(“%d”, &count);

p=(int *)malloc( sizeof(int) * count ); /*申请动态数组使用的内存块*/

if ( p==NULL ) exit(0);

for (i=0; i

for (q=p+ count-1; q>=p; q++) printf(“%d,”, *q); /*倒序显示*/

free(p); /*释放由malloc()函数申请的内存块*/

} 程序功能是键入任意个数据,倒序显示。

5.1 库函数malloc()

①用法:void *malloc(unsigned size)。②功能:在内存的动态存储区分配size个字节的连续空间。③返回值:申请成功,则返回新分配内存块的起始地址;否则,返回NULL。

malloc()函数的返回值是一个无类型指针,但在实际使用malloc()函数时,必须将其返回值强制转换成被赋值指针变量的数据类型,否则出错。

5.2 运算符sizeof

①格式:sizeof(变量名/类型名)。②功能:求变量/类型占用的内存字节数。如sizeof(long)=4。

5.3 库函数free()

①用法:void free(void *ptr)。②功能:释放由ptr指向的内存块(ptr是调用malloc() 函数的返回值)。③返回值:无。

一般情况下,使用malloc()函数申请的内存块,操作结束后,应及时使用free()函数予以释放。特别是在循环使用malloc()函数申请时,如果不及时释放不再使用的内存块,很可能很快就耗尽系统的内存资源,从而导致程序无法继续运行甚至死机。

6 结束语

学习C语言必须掌握指针的概念,以便为以后C系列语言学习打下基础。

参考文献:

[1]谭浩强.C语言程序设计[M].清华大学出版社,2004.

[2]丁爱萍.C语言程序设计实例教程[M].西安电子科技大学出版社,2006.

[3]林小茶.C语言程序设计[M].中国铁道出版社,2005.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值