Chinaunix首页 | 论坛 | 博客
  • 博客访问: 253086
  • 博文数量: 53
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 380
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-01 10:17
文章分类

全部博文(53)

文章存档

2013年(53)

分类: C/C++

2013-08-26 22:55:33

C++指针与引用:指针运算

  在C++中,指针也能与整数作加减运算,即让指针变量加一个整数或减一个整数。但指针运算与整数的运算并不相同,它与指针所指向的变量的大小有关。例如:

  char *str = "HELLO";

  int nums[] = {10, 20, 30, 40};

  int *ptr = &nums[0]; // 指向nums数组第一个元素

  假定一个int型变量占用的内存空间是4个字节。在上例中,str++使str移动一个字符(一个字节),指向"HELLO"的第二个字符;而ptr++使ptr移动一个int型数(即4个字节),指向数组的第二个元素,如图7-11。

  所以,"HELLO"的元素可以通过*str、 *(str + 1)、 *(str + 2)等引用,nums的元素可以用*ptr、 *(ptr + 1)、*(ptr + 2)、*(ptr + 3)等引用。

  在C++中,两个相同类型的指针也允许作减运算。例如:

  int *ptr1 = &nums[1];

  int *ptr2 = &nums[3];

  int n = ptr2 - ptr1; // n变为2

  在处理数组元素时,指针运算是非常方便的。例如:

  void CopyString (char *dest, char *src)

  {

  while (*dest++ = *src++);

  }

  这个循环是将src指向的内容赋给dest指向的内容,然后,两个指针分别加1。当src的结尾符被赋给dest时,条件表达式变为0,即为假,循环结束。

  图7-11 指针运算

  指针是一种特殊的变量,它所允许的运算有下面几种:赋值运算、算术运算和关系运算。

  (1) 指针的赋值运算

  可以将一个变量的地址赋给一个指针,也可以将一个数组的首地址或一个函数的入口地址赋给指针,但所赋的地址值必须与指针的类型匹配。另外,相同类型的指针之间也可以相互赋值。例如:

  int a,*p,*q;

  p=&a;

  q=p;

  这样就使q与p指向的同一个变量a,即p和q都是指向变量a的指针。

  另外,为了安全起见,可以将NULL(即0)赋给暂时不用的指针,使它不指向任何变量,该指针称为空指针。

  (2)指针的算术运算

  由于指针存放的都是内存地址,所以指针的算术运算都是整数运算。

  一个指针可以加上或减去一个整数值,包括加1和减1。根据C++地址运算规则,一个指针变量加(减)一个整数并不是简单地将其地址量加(减)一个整数。而是根据其所指的数据类型的长度,计算出指针最后指向的位置。例如,p+i实际指向的地址是:

  p+i*m

  其中m是数据存储所需的字节数,一般情况下,字符型数据m=1,整型数据m=2,浮点型数据m=4。例如,下面的语句说明了一个int型指针变量p进行算术运算的情况。

  int *p; //p=3000

  p++; //p=3002

  p--; //p=2FFE

  因为一个整数在内存中占两个字节的空间。p++操作是使指针p指向下一个整型数据,同理可知,p--操作是使指针p指向前一个整型数据。

  此外,如果两个指针所指的数据类型相同,在某些情况下,这两个指针可以相减。例如,指向同一个数组的不同元素的两个指针可以相减,其差便是这两 个指针之间相隔元素的个数。又例如,在一个字符串里面,让指向字符串尾的指针和指向字符串首的指针相减,就可以得到这个字符串的长度。

  (3)指针的关系运算

  在某些情况下,两个指针可以相比较,但要求这两个指针指向相同类型的数据。指针间的关系运算包括:>、>=、<、<=、==、!= 。例如,比较两个指向相同数据类型的指针,如果它们相等,就说明它们指向同一个地址(即同一个数据)。

  如:if(p1==p2) printf("two pointrs are equal.\n");

  指向不同数据类型的指针之间进行关系运算是没有意义的。但是,一个指针可以和NULL(0)作相等或不等的关系运算,用来判断该指针是否为空。

阅读(2287) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~