2013年(53)
分类: C/C++
2013-08-26 22:55:33
在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)作相等或不等的关系运算,用来判断该指针是否为空。