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

时间:2022-05-22 09:47:32

原文:http://www.cnblogs.com/ddx-deng/archive/2012/12/16/3755862.html

第一个结论:

#include "iostream.h"
void main()
{
1、 char str[]="abcdef";
2、int n[]={1,2,3,4,5};
3、char *p=str;//
4、 cout<<sizeof(str)<<endl;一个字母在内存中占一个字节,这里输出7,7个字节但是6个字母,原因是字符串后面有一个‘\0’结束符,也占一个字节
5、cout<<sizeof(n)<<endl;一个int数据在内存中占用4个字节,输出4*5=20
6、cout<<sizeof(p)<<endl;输出4

7、p++;

8、str++;
}

7

20

4

看似指针和数组名是相同的,其实不然;第4行和第6行输出结果不同就是证明,前者是字符数组长度7,而指针在32位机中是一个DWORD,4个字节,在64位中就是8了。

第二个结论:

第8句存在的话会编译报错,也就是数组名不能自加和自减,而指针可以。

(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;//************这才是实质

(2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;//********code

(3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!//********code

第三个结论:数组名失去原本内含,沦为指针。可以做自增自减操作。

#include "iostream.h"
void Fun(char str[]);
void main()
{
1、 char s[6];
 2、 Fun(s);
}
void Fun(char str[])
{
   cout<<sizeof(str)<<endl;
}

第2句的结果不再是6,而是指针大小4.

分析一个别人提问的例子:

#include "iostream.h"
void main()
{
int a[]={1,2,3,4,5};
int *ptr=(int *)(&a+1);//&a是不是取地址,还是引用?
cout<<*(ptr-1)<<endl;
cout<<*(ptr)<<endl;
}

最终输出结果:5.

解释1:a是一个数组名,上面说的,数组是一个数据结构;并且a已经能代表数据结构(本数组)的地址了,于是&a是对数据结构取地址,取得的地址+1会怎么样?会指向下一个数据结构,但是这里只有一个数据结构。。。那么int *ptr=(int *)(&a+1);执行后ptr指向数据结构(int[5]的数组)的结束,a是数组,&a 就是指向数组的指针,&a+1所以位移5个int,*(ptr-1)又是int* 反位移1个,5-1=4,位移4位就是第五个数

解释2:a是一个int[5]类型,所以&a+1就会到数组末尾,再减1就是5的位置