指针和数组基本等价的原因在于指针算术和 c++ 内部处理数据的方式。
将整数变量加 1 后,其值将增加 1;但将指针变量加 1 后,增加的量等于它指向的类型的字节。 例如,将 double 类型的指针加 1,如果系统对 double 使用 8 个字节存储,则数值将增加 8;将指向 short 的指针加 1 后,如果系统对 short 使用2 个字节存储,则指针值将增加 2;
示例程序如下:
double a3[3] {2.3, 3.3, 2.1}; double *pr = a3; cout << "pr: " << pr << endl; cout << "pr + 1: " << pr + 1 << endl;
运行结果如下:
2.1 可以将数组名解释为地址的情况在多数情况下,c++ 将数组名解释为地址
比如下面的语句,将 pw 声明为指向 double 类型的指针,然后将它初始化为 wages — wages 数组中第一个元素的地址:
double wages[3] {1.0, 2.3, 4.2}; // 声明 double 数组 double *pw = wages; // 声明 double 指针,将数组 wages 的第一个元素的地址给指针 pw
这样的话有以下等式:
wages = &wages[0];2.2 不能将数组名解释为地址的情况 2.2.1 使用 sizeof 运算符时
对数组应用 sizeof 运算符得到的是数组的长度,而对指针应用 sizeof 得到的是指针的长度(指针变量的长度),即使指针指向的是一个数组。在这种情况下,c++ 不会将数组名解释为地址。
2.2.2 对数组取地址时对数组名应用地址运算符时,得到的是整个数组的地址。
示例程序如下:
#includeint main() { using namespace std; short tell[3]; cout << tell << endl; cout << &tell << endl; cout << tell + 1 << endl; cout << &tell + 1 << endl; return 0; }
程序说明:
从数字上说,tell 和 &tell 的地址相同;但从概念上说,tell (即 &tell[0])是一个 2 字节内存块的地址,而 &tell 是一个 6 字节内存块的地址。因此,tell + 1将地址值加 2,而表达式 &tell + 1 将地址加 6。
- 在 cout 和多数 c++ 表达式中,char 数组名、char 指针以及使用引号括起的字符串常量都被解释为字符串的第一个字符的地址。
- 一般来说,编译器在内存内留下一些空间,以存储程序源代码中所有用引号括起来的字符串,并将每个被存储的字符串与其地址关联起来,这意味着可以像使用字符串那样使用指针。如下所示:
char *bird = "bird"; cout << "I have a " << bird << endl;
- 一般来说,如果给 cout 提供一个指针,它将打印地址。但如果指针的类型为 char*,则 cout 将显示指向的字符串,示例程序如下:
int a = 1; int* pr = &a; char b[10] = "abc"; char* ps = b; cout << "int 类型的指针,pr: " << pr << endl; cout << "char 类型的指针,ps: " << ps << endl;
输出结果为:
int 类型的指针,pr: 00FDF7E4 char 类型的指针,ps: abc
- 如果想要显示的是字符串的地址,必须将这种指针强制转换成另一种指针类型,如 int*,示例程序如下(在上面的程序段进行修改):
cout << "char 类型的指针,显示指针的值(地址):" << (int*) ps << endl;
输出结果为:
char 类型的指针,显示指针的值(地址):0133FB50
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)