C/C++中关于地址、指针和引用变量的学习笔记(二) : 数组
2010-07-21 10:14
906 查看
接上例,这次谈一下指针和数组的关系。
在上例中的例子其实已经涉及到了数组。我们采用的是通过地址运算符(&)来获取数组第一个元素的地址。其实另外还有一种方法,那就是:直接使用数组的名字。在表达式中使用数组名就相当于使用数组的第一个元素的地址。
下面的例子是等效的:
float* dp1 = &dues[0];
float* dp2 = dues;
我们来进一步讨论这种新的表示方法。
一个数组后面跟上加号和一个整型的表达式,就相当于以该整型表达式作为下标的数组元素的地址。
例如:
float* dp1 = &dues[2];
float* dp2 = dues+2;
如果是多维数组,那么在不带任何一维的下标时,这种地址表示法仍然适用。
先看下面的例子:
运行结果:
更令人疑惑的是,还可以在指针的后面加上数组的下标。
下面的代码是等价的:
int* ip;
x = *(ip+3);
x = ip[3];
这个例子表明,即使ip是一个指针,当他指向一个数组时,也可以采用数组元素的表示法来使用这个指针。
不仅如此,还可以利用指针表示法来使用数组名,这样也可以访问数组的元素。
例如:
int ia[10];
x = ia[3];
x = *(ia+3);
以下代码给出了指针和数组的常见用法:
运行结果如下:
可见,上诉6种写法都会在控制台输出同样的结果。
注意:
推荐最好还是对于下标就采用下标表示法,对于指针就采用指针表示法,这样更清晰易懂。上诉代码中的前2个循环就是如此。
另外还有一种变化形式是把数组变成一个指向数组的指针。如下所示,把上诉代码中的msg声明为一个字符型指针:
char* msg = "Now is the time/n";
程序将产生同样的输出结果。
可见,可以使用一个字符串常量来初始化字符型指针。在编译器内部,用一个字符型数组来表示字符串常量,当使用字符串常量时,实际上是引用它的内部地址。所以,把字符串赋给字符型指针实际上就是把常量的地址赋给指针。
在上例中的例子其实已经涉及到了数组。我们采用的是通过地址运算符(&)来获取数组第一个元素的地址。其实另外还有一种方法,那就是:直接使用数组的名字。在表达式中使用数组名就相当于使用数组的第一个元素的地址。
下面的例子是等效的:
float* dp1 = &dues[0];
float* dp2 = dues;
我们来进一步讨论这种新的表示方法。
一个数组后面跟上加号和一个整型的表达式,就相当于以该整型表达式作为下标的数组元素的地址。
例如:
float* dp1 = &dues[2];
float* dp2 = dues+2;
如果是多维数组,那么在不带任何一维的下标时,这种地址表示法仍然适用。
先看下面的例子:
#include <iostream> // A two-dimensional integer array. int calendar[5][7] = { { 1, 2, 3, 4, 5, 6, 7 }, { 8, 9,10,11,12,13,14 }, { 15,16,17,18,19,20,21 }, { 22,23,24,25,26,27,28 }, { 29,30,31 } }; //////////////////////////////////////// // The main() function. //////////////////////////////////////// int main() { int* cp1 = &calendar[3][2]; // Address of 4th week,3rd day. int* cp2 = calendar[3]+2; // " " " " " " int* cp3 = calendar[0]; // Address of array. int* cp4 = calendar[2]; // address of 3rd week,1st day. std::cout << *cp1 << ' ' << *cp2 << ' ' << *cp3 << ' ' << *cp4; return 0; }
运行结果:
更令人疑惑的是,还可以在指针的后面加上数组的下标。
下面的代码是等价的:
int* ip;
x = *(ip+3);
x = ip[3];
这个例子表明,即使ip是一个指针,当他指向一个数组时,也可以采用数组元素的表示法来使用这个指针。
不仅如此,还可以利用指针表示法来使用数组名,这样也可以访问数组的元素。
例如:
int ia[10];
x = ia[3];
x = *(ia+3);
以下代码给出了指针和数组的常见用法:
#include <iostream> // A character array. char msg[] = "Now is the time/n"; //////////////////////////////////////// // The main() function. //////////////////////////////////////// int main() { char* cp; // A pointer to char. int i; // An integer subscript // Pointer access, pointer notation. for (cp = msg; *cp; cp++) std::cout << *cp; // Subscript access, subscript notation. for (i = 0; msg[i]; i++) std::cout << msg[i]; // Pointer access, subscript notation. for (cp = msg; cp[0]; cp++) std::cout << cp[0]; // Subscript access, pointer notation. for (i = 0; *(msg+i); i++) std::cout << *(msg+i); // Pointer and subscript access, pointer notation. for (i = 0, cp = msg; *(cp+i); i++) std::cout << *(cp+i); // Pointer and subscript access, subscript notation. for (i = 0, cp = msg; cp[i]; i++) std::cout << cp[i]; return 0; }
运行结果如下:
可见,上诉6种写法都会在控制台输出同样的结果。
注意:
推荐最好还是对于下标就采用下标表示法,对于指针就采用指针表示法,这样更清晰易懂。上诉代码中的前2个循环就是如此。
另外还有一种变化形式是把数组变成一个指向数组的指针。如下所示,把上诉代码中的msg声明为一个字符型指针:
char* msg = "Now is the time/n";
程序将产生同样的输出结果。
可见,可以使用一个字符串常量来初始化字符型指针。在编译器内部,用一个字符型数组来表示字符串常量,当使用字符串常量时,实际上是引用它的内部地址。所以,把字符串赋给字符型指针实际上就是把常量的地址赋给指针。
相关文章推荐
- C/C++中关于地址、指针和引用变量的学习笔记(七) : sizeof和typedef
- C/C++中关于地址、指针和引用变量的学习笔记(九) : 内存结构
- C/C++中关于地址、指针和引用变量的学习笔记(八) : 命令行参数
- C/C++中关于地址、指针和引用变量的学习笔记(四) : 函数
- C/C++中关于地址、指针和引用变量的学习笔记(五) : 指针
- C/C++中关于地址、指针和引用变量的学习笔记(一)
- C/C++中关于地址、指针和引用变量的学习笔记(三) : 结构
- C/C++中关于地址、指针和引用变量的学习笔记(六) : const和void
- C/C++中关于地址、指针和引用变量的学习笔记(十) : 引用型变量
- C++ 学习笔记(2)变量和基本类型(复合类型:引用、指针)、const、constexpr、typedef(using)、auto、decltype
- 我的C++学习日记——关于const数值变量,指针和引用的理解
- C++学习笔记2--函数重载 复杂的数据 内存对齐 指针数组 结构与指针 传值传址传引用 联合枚举类型别名
- C++学习笔记(六)-- 类和对象 构造函数和析构函数 const成员函数 this指针 对象数组 堆栈管理变量
- C++学习笔记(三)--函数参数,数组函数,指针和const,二维数组函数,递归,函数指针
- C++学习笔记29,引用变量(1)
- C++学习笔记--指针和多维数组
- C_PlusPlus学习笔记 - 5_数组、指针和字符串 (C++语言程序设计【第三版】 郑莉等,清华大学出版社)
- C++学习笔记 c++引用(&)与指针(*)的区别
- c++ 数组,变量,指针,引用, 初始化,赋值
- [C++ Primer Plus]学习笔记--关于C++ string和c类型字符数组的对比