关于数组的a和&a的区别:一个是普通的指针,一个是数组的指针

本文通过两个实验性程序代码实例,详细解释了C++中数组与指向数组的指针的区别,包括它们的地址运算行为及类型的差异。

这个问题是我和同学讨论时,产生的思考,后来做的实验性解答。
先来看一段小程序

1.  #include<iostream>  
2.  using namespace std;  
3.    
4.  int main()   
5.  {   
6.  int a[5]={1,2,3,4,5};  
7.  int *ptr=(int *)(&a+1);  
8.  cout<<*(a+1)="<<*(a+1)<<"*(ptr-1)="<<*(ptr-1);  
9.  return 09.  } 

输出结果:
*(a + 1) = 2
*(ptr – 1) = 5
原因是a代表数组a的首地址,而&a代表的是整个数组a的地址,目前它们的值是一样的。但是如果当它们分别进行加1的时候操作,代表的含义就不同了
测试用例代码:

1.  #include<iostream>  
2.  using namespace std;  
3.    
4.  int main() {  
5.      int a[5]={1,2,3,4,5};    
6.      cout<<" a type="<<typeid(a).name()<<endl;  
7.      cout<<" &a type="<<typeid(&a).name()<<endl;
8.      return 08.  }  

输出结果:
a type = int *
&a type = int (*)[5]
也就是说 一个是普通的指针,一个是数组的指针,二者严格的讲,类型不同,划分的尺度大小不同

在 C 语言中,二维数组的 `&amp;a` `a` 之间存在显著的区别,这些区别主要体现在它们的类型所代表的地址含义上。以下是详细分析: ### `a` 的含义 在二维数组的上下文中,`a` 是数组名,它表示数组首元素的地址。具体来说,对于一个二维数组 `int a[3][4]`,`a` 表示的是数组中第一行(即 `a[0]`)的地址。从内存布局的角度来看,`a` 的值与 `&amp;a[0]` 相同,但它们的类型不同。`a` 的类型是 `int (*)[4]`,这意味着它指向一个包含 4 个整数的数组 [^3]。 ### `&amp;a` 的含义 `&amp;a` 是对整个二维数组的取地址操作。对于 `int a[3][4]`,`&amp;a` 表示的是整个数组地址。它的类型是 `int (*)[3][4]`,这表明它指向一个包含 3 行 4 列的二维数组。虽然 `&amp;a` `a` 的地址值相同,但它们的类型不同,因此在指针运算中会有不同的行为 [^2]。 ### 地址值的比较 尽管 `&amp;a`、`a` `&amp;a[0]` 的地址值相同,它们的用途操作方式却截然不同。例如,`a + 1` 会跳过一行(即 4 个整数),而 `&amp;a + 1` 会跳过整个二维数组(即 3 行 4 列) [^2]。 ### 类型指针运算的区别 1. **`a` 的指针运算**:`a` 的类型是 `int (*)[4]`,因此 `a + 1` 会跳过 4 个整数的大小(即一行)。 2. **`&amp;a` 的指针运算**:`&amp;a` 的类型是 `int (*)[3][4]`,因此 `&amp;a + 1` 会跳过整个二维数组的大小(即 3 行 4 列) [^2]。 ### 示例代码 以下代码展示了 `a` `&amp;a` 的地址值及其指针运算的差异: ```c #include <stdio.h> int main() { int a[3][4] = {0}; printf("a = %p\n", (void*)a); // 地址值:a printf("&amp;a = %p\n", (void*)&amp;a); // 地址值:&amp;a printf("a + 1 = %p\n", (void*)(a + 1)); // 指针运算:a + 1 printf("&amp;a + 1 = %p\n", (void*)(&amp;a + 1)); // 指针运算:&amp;a + 1 return 0; } ``` ### 总结 - `a` 表示数组首元素的地址,类型为 `int (*)[4]`。 - `&amp;a` 表示整个数组地址,类型为 `int (*)[3][4]`。 - 虽然它们的地址值相同,但由于类型不同,指针运算的行为也不同 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值