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

这个问题是我和同学讨论时,产生的思考,后来做的实验性解答。

先来看一段小程序

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 0;
9.  } 

输出结果:

*(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 0;
8.  }

输出结果:

a type = int *

&a type = int (*)[5]

也就是说 一个是普通的指针,一个是数组的指针,二者严格的讲,类型不同,划分的尺度大小不同

时间: 2024-12-19 13:20:33

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

C 字符串指针与字符数组的区别

用字符数组和字符指针变量都可实现字符串的存储和运算.但是两者是有区别的.在使用时应注意以下几个问题: 1. [字符串指针变量]本身是一个变量,用于存放字符串的首地址. 而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以'\0'作为串的结束. [字符数组]是由于若干个数组元素组成的,它可用来存放整个字符串. 2. 对字符串指针方式  char *ps="C Language"; 可以写为: char *ps;  ps="C Language"; 而对数组方式

指针 与 数组 以及 a 与 &amp;a的区别

指针 与数组 并没有什么关系, 指针就是指针,指针变量在32位系统下,永远占4个byte,其值为某一个内存的地址,指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到; 数组就是数组,其大小与元素的类型和个数有关,定义数组时必须指定其元素的类型和个数,数组可以存储任何类型的数据,但是不能存放函数;; char *p = "abcdef"; // "abcdef" 放在静态区; 1) 以指针的形式:*(p+4) 这种形式先取出p存储的地址值,然后在加上4

数组与ArrayList的关系与区别

数组与ArrayList的关系与区别 一.数组与ArrayList的主要区别:效率.类型识别和primitive type.数组([]):最高效:但是其容量固定且无法动态改变:ArrayList:容量可动态增长:但牺牲效率:建议:首先使用数组,无法确定数组大小时才使用ArrayList! 1.效率:数组扩容是对ArrayList效率影响比较大的一个因素.每当执行Add.AddRange.Insert.InsertRange等添加元素的方法,都会检查内部数组的容量是否不够了,如果是,它就会以当前容

数组与指针的区别,以及在STL中传递数组/指针

数组和指针在作为实参传入T[] 或T*的形参时没有区别 void f(int pi[]) { cout << sizeof(pi) << endl; } int a[5] = { 1,2,3,4,5 }; f(a); 上述代码输出的是4(32位系统)或8(64位系统),总之不是sizeof(int) * 5(数组大小). 为什么明明形参是数组形式的int [],实际上和指针形式的int *无异呢?关键原因就在于,数组是不能作为左值的. 也就是说,你不能定义两个数组,比如int a[

C++学习之数组名a与&amp;a的区别

在C++中定义一个数组: int a[5]={1,2,3,4,5} 那么a到底代表什么含义呢?首先想到的是a代表的是数组的首元素地址.那么如果问你a的类型是什么呢?估计很多人就不太确定了,看下面程序,让编译器告诉我们a是什么类型的数据: main.cpp如下: 从图片中的错误提示可以看出: a的类型是int [5]类型.那么直接将a赋值给一个int (*)[5]类型的指针类型是不行的,所以需要对a进行取地址操作&a这样得到的类型才是int(*)[5]类型(指向int [5]类型的指针类型). 那

数组、List和ArrayList的区别

有些知识点可能平时一直在使用,不过实际开发中我们可能只是知其然不知其所以然,所以经常的总结会对我们的提高和进步有很大的帮助,这里记录自己在工作之余的问题,持续更新,欢迎高手斧正. 数组.List和ArrayList的区别 数组在内存中是连续存储的,所以它的索引速度是非常的快,而且赋值与修改元素也很简单,比如: string[] s=new string[3]; //赋值 s[0]="a"; s[1]="b"; s[2]="c"; //修改 s[1

[数据结构] 数组与链表的优缺点和区别

概述 数组 是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素.但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中.同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素.如果应用需要快速访问数据,很少插入和删除元素,就应该用数组. 链表 中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起,每个结点包括两个部分:一个是存储 数据元素 的 数据域,另一个是存储下一个结点地址的

数组array和切片(slice)的区别

一 数组简介: 数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值.在初始化后长度是固定的,无法修改其长度.当作为方法的参数传入时将复制一份数组而不是引用同一指针.数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度.注意:和C中的数组相比,又是有一些不同的 1. Go中的数组是值类型,换句话说,如果你将一个数组赋值给另外一个数组,那么,实际上就是将整个数组拷贝一份2. 如果Go中的数组作为函数的参数,那么实际传递的参数是

c#数组的count()和length的区别

C# 数组中 Length 表示数组项的个数,是个属性. 而 Count() 也是表示项的个数,是个方法,它的值和 Length 一样.但实际上严格地说 Count() 不是数组的内容,而是 IEnumerable 的内容.这也是为什么 C# 2.0 时数组不能用 Count(),而 3.0 后就可以用 Count() 的原因. 对于数组,据说用 Length 快于 Count(). 所以一般情况:数组我用 Length,IEnumerable(比如 List)我用 Count().

字符指针,字符数组,双引号的字符串的区别与联系

作者 :  陈宗权 先说说双引号的字符串,比如"chenzongquan",它是由里面咱们看到的一系列字符以及一个尾随的'\0'字符组成,存储在内存的只读存储区中.只读存储区是在整个程序运行期间都保留着的.可见的,而且其中的数据原则上是保持不变的.所以对一个双引号表示的字符串,只要你知道它的具体地址,可以在程序的任何一个函数中再次使用. 说到只读,要引一下,在16位系统中没有进行内存访问保护,所以在程序运行时实际上也可以改变只读存储区中的数据,但是在32位系统中有内存访问保护,程序运行