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是一个数值中的元素。