C++指针与数组的联系和区别


一、指针

1.可以在声明语句中初始化指针。在这种情况下,被初始化的是指针,而不是它指向的值。也就是说,

int a = 4;

int* p = &a;

将p(而不是*p)的值设置为&a。

2.在C++中创建指针时,计算机将分配用来存储指针的内存,但不会分配用来存储指针所指向的数据的内存。所以如下是不允许的:

int* b;

*b = 22;

注意:一定要在对指针应用解除应用操作符(*)之前,将指针初始化为一个确定的、适当的地址。这是关于使用指针的金科玉律。

3.不能简单的将整数赋给指针,例如下面的是不允许的:

int* p;

p= 0xC0000000;

从概念上看,指针和整数是截然不同的类型。整数是可以执行加、减、乘、除等运算的数字,而指针描述的是位置,将两个地址相乘没有任何意义。要将数字值作为地址来使用,应通过强制类型转换将数字转换为适当的地址类型。

int* p;

p = (int*)0xC0000000;

注意:p是int值的地址,并不意味着p本身的类型是int。例如,在使用DOS的IBM PC中的大型内存模式下,int类型是一个2个字节的值,而地址是一个4个字节的值。

二、指针和数组

首先声明一点:指针和数组基本等价的原因在于指针算术和C++内部处理数组的方式,C++将数组名解释为地址。

将指针变量和数组名加1后,其增加的值等于指向的类型占用的字节数。例如:

int a[5] = {1,2,3,4,5};

int* p = a;

C++将数组名解释为数组的第一个元素的首地址,即p = &a[0];

那么*(p+1)和*(a+1)是等效的,*(p+2)和*(a+2)也是等效的,同样用下标也是一样的。

区别:①可以修改指针的值,但是数组名是常量,其不能作为左值。例如:

p = p+1;可以,而a = a+1;不可以。

②对数组应用sizeof操作符得到是数组的长度,而对指针应用sizeof得到的是指针的长度,即使指针指向的是一个数组。例如:

sizeof(a)= 20;而sizeof(p)=4。

三、函数、数组和指针

注意:在函数原型或函数定义头文件的场合中(并且也只有这两种场合中),可以用int* a代替函数参量int a[ ]。因此下面的4种原型都是等价的:

int test(int *a,int n);

int test(int a[ ],int n);

int test(int *,int );

int test(int [ ],int );

原型允许省略名称,但是定义函数时,名称是不可以省略的。

无论在任何情况下,形式int *a都表示a是指向int的指针,形式int a[ ]也可以表示a是指向int 的指针,但只是在声明形式参量的时候才可以这样使用。使用第二种形式可以提醒用户a不仅指向一个int数值,而且它指向的这个int是一个数值中的元素。

C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码

读C++ Primer 之构造函数陷阱

读C++ Primer 之智能指针

读C++ Primer 之句柄类

C++11 获取系统时间库函数 time since epoch

C++11中正则表达式测试

本文永久更新链接地址:

相关内容