数组名的含义、指针含义

来源:互联网 发布:淘宝淘金币首页 编辑:程序博客网 时间:2024/06/09 20:11

数组名的含义

 

         int a[2]={1,2};

   

         cout<<&a<<endl;

         cout<<a<<endl;

         cout<<&a[0]<<endl;

         cout<<*a<<endl;

         cout<<sizeof(a)<<endl;

 

0012F0C8

0012F0C8

0012F0C8

1

8

由此可见, 数组名a的值、&a、&a[0]的值相同,而a[0]为数组的第一个元素。

我们可以推断: 编译器没有为数组名分配空间,但编译器对数组名做了特殊处理

即是,     数组名    为数组首地址,

而且       &数组名  也是代表的数组首地址。

 

 

 

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

         int (*p)[4];

 

         p=a;  // 这种赋值是错误的

 

         p=&a; // 这种赋值是正确的,原因p是数组指针 所以应将数组的地址赋值给p  

               //                                就如同p若为整形指针,则应将整形的地址赋值给p

               //                                虽然在实际中,数组名与&数组名 都是同一个值,但是编译器在逻辑上仍然将a视为数组,将&a视为取数组的地址

               //                                所以数组指针=&数组名  即p=&a;

 

 

又如程序:

 

 

 

         int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

         int (*p)[4];

 

 

 

        

         for(p=&a[0];p<&a[0]+3;p++)

                   cout<<&p<<endl;

         cout<<endl;

 

 

         for(p=&a[0];p<&a[0]+3;p++)

                   cout<<p<<endl;

         cout<<endl;

 

         for(p=&a[0];p<&a[0]+3;p++)

                   cout<<*p<<endl;

         cout<<endl;

 

         for(p=&a[0];p<&a[0]+3;p++)

                   cout<<**p<<endl;

 

 

输出:

 

0012F0CC   // &p

0012F0CC

0012F0CC

 

0012F09C   / /p

0012F0AC

0012F0BC

 

0012F09C   //*p

0012F0AC

0012F0BC

 

1         //**p

5

9

指针含义

 

指针  是一个变量,占用4字节, 用以保存地址。

 

指针的SIZE是固定的,是4字节,但是指针指向的那块内存区域的大小取决于指针的类型。

 

 

Int *p  ;       指向的内存区域以4字节为一个单元进行操作

 

Char *p;       指向的内存区域为以1字节为一个单元进行操作

 

Char  (*p)[5];  指向的内存区域为以5个字节为一个单元进行操作

 

 

Class B:public A

{
}

 

A *p =new B();   指针指向的内存区域为生产的B对象中继承自A的那部分空间