学学习网 手机版

学学习网

学习路径: 学习首页 > 应用开发 > c++ >

第五节 数组 (Arrays)(8)

设置字体:
----------------------------------

假设我们有3个指针:
char *mychar;
short *myshort;
long *mylong;
而且我们知道他们分别指向内存地址1000, 2000 和3000。
因此如果我们有以下代码:
mychar++;
myshort++;
mylong++;
就像你可能想到的,mychar的值将会变为1001。而myshort 的值将会变为2002,mylong的值将会变为3004。原因是当我们给指针加1时,我们实际是让该指针指向下一个与它被定义的数据类型的相同的元素。因此,它所指向的数据类型的长度字节数将会被加到指针的数值上。以上过程可以由下图表示:

这一点对指针的加法和减法运算都适用。如果我们写以下代码,它们与上面例子的作用一抹一样: mychar = mychar + 1;
myshort = myshort + 1;
mylong = mylong + 1;
这里需要提醒你的是,递增 (++) 和递减 (--) 操作符比引用操作符reference operator (*)有更高的优先级,因此,以下的表达式有可能引起歧义:
*p++;
*p++ = *q++;
第一个表达式等同于*(p++) ,它所作的是增加p (它所指向的地址,而不是它存储的数值)。
在第二个表达式中,因为两个递增操作(++) 都是在整个表达式被计算之后进行而不是在之前,所以*q 的值首先被赋予*p ,然后q 和p 都增加1。它相当于:
*p = *q;
p++;
q++;
像通常一样,我们建议使用括号()以避免意想不到的结果。
 
指针的指针Pointers to pointers
C++ 允许使用指向指针的指针。要做到这一点,我们只需要在每一层引用之前加星号(*)即可:
char a;
char * b;
char ** c;
a = 'z';
b = &a;
c = &b;
假设随机选择内存地址为7230, 8092 和10502,以上例子可以用下图表示:

(方框内为变量的内容;方框下面为内存地址)
这个例子中新的元素是变量c,关于它我们可以从3个方面来讨论,每一个方面对应了不同的数值:
c 是一个(char **)类型的变量,它的值是8092
*c 是一个(char*)类型的变量,它的值是7230
**c 是一个(char)类型的变量,它的值是'z'
 
空指针void pointers
指针void 是一种特殊类型的指针。void 指针可以指向任意类型的数据,可以是整数,浮点数甚至字符串。唯一个限制是被指向的数值不可以被直接引用(不可以对它们使用引用星号*),因为它的长度是不定的,因此,必须使用类型转换操作或赋值操作来把void 指针指向一个具体的数据类型。
它的应用之一是被用来给函数传递通用参数:
// integer increaser
#include <iostream.h>

void increase (void* data, int type) {
switch (type) {
case sizeof(char) : (*((char*)data))++; break;
case sizeof(short): (*((short*)data))++; break;
case sizeof(long) : (*((long*)data))++; break;
}
}

int main () {
char a = 5;
short b = 9;
long c = 12;
increase (&a,sizeof(a));
increase (&b,sizeof(b));
increase (&c,sizeof(c));
cout << (int) a << ", " << b << ", " << c;
return 0;
}
6, 10, 13
sizeof 是C++的一个操作符,用来返回其参数的长度字节数常量。例如,sizeof(char) 返回 1,因为 char 类型是1字节长数据类型。
 
函数指针Pointers to functions
C++ 允许对指向函数的指针进行操作。它最大的作用是把一个函数作为参数传递给另外一个函数。声明一个函数指针像声明一个函数原型一样,除了函数的名字需要被括在括号内并在前面加星号asterisk (*)。例如:
// pointer to functions
#include <iostream.h>

int addition (int a, int b) {
    return (a+b);
}

int subtraction (int a, int b) {
    return (a-b);
}

int (*minus)(int,int) = subtraction;
int operation (int x, int y, int (*functocall)(int,int)) {
    int g;
    g = (*functocall)(x,y);
    return (g);
}

int main () {
    int m,n;
    m = operation (7, 5, addition);
    n = operation (20, m, minus);
    cout <<n;
    return 0;
}
8
在这个例子里, minus 是一个全局指针,指向一个有两个整型参数的函数,它被赋值指向函数subtraction,所有这些由一行代码实现:
----------------------------------
课程列表
重点难点
赞助链接