您的位置:首页 > 编程语言 > C语言/C++

C/C++中关于地址、指针和引用变量的学习笔记(二) : 数组

2010-07-21 10:14 906 查看
上例,这次谈一下指针和数组的关系。

在上例中的例子其实已经涉及到了数组。我们采用的是通过地址运算符(&)来获取数组第一个元素的地址。其实另外还有一种方法,那就是:直接使用数组的名字。在表达式中使用数组名就相当于使用数组的第一个元素的地址。

下面的例子是等效的:

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";

程序将产生同样的输出结果。

可见,可以使用一个字符串常量来初始化字符型指针。在编译器内部,用一个字符型数组来表示字符串常量,当使用字符串常量时,实际上是引用它的内部地址。所以,把字符串赋给字符型指针实际上就是把常量的地址赋给指针。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐