数组名a1为什么可以表示a

2021-03-05 13:15:02 字数 4206 阅读 1255

1楼:匿名用户

a + 1 会隐式的转换成 a + 1 * sizeof( int ) 所以如果是double 的数组 就实际上+8了 int的实际上是+4

2楼:夜礼服假面

数组:我们先咬文嚼字一下,数指数据,组,就是小组,由数据组成的小组,就叫数组(学计算机的,不光要学好计算机,也要学好语文,偶尔还

要懂点医学,你要是经常看计算机图书,你看台湾人写的书,都有很多文言文在里面,我们这点做的完全没有台胞做的好,所以人家计算机牛啊,世界上的电子代

工,台湾占了绝大数比例)。

数组有几个特点一定要注意,看到数组就要想到:

1、数组里面的数据类型是相同的,小组里面的成员肯定要一样的啊,驴堆里站一马,驴马不分,鸡窝里蹲一丹顶鹤,鹤立鸡群,这都是不合群的东西,计算机里面也讲

“和谐”。我们顺便看下数据的基本类型:int float double char 这些是基本类型,所以它们可以存在以下类似数组:int

a[10], float f[10], doule d[10], char str[10]; 它们每一个都有10个元素,每一个元素的类型都是其前面声明的类型。我们是学嵌入式的,我们不能光看到表面的东西,我们要看到底,好东西是走了光才叫好,光有好东西,别人不知道也不行。其实数组在内存中是连续分配的,如下图:

定义了一char型数组a,它有6个元素,分别是'a', 'b', 'c', 'd', 'e',

'f',它们在内存里面是连续存放的,每个元素占用一个字节。 强烈谴责那些将'a'

当成"a"的人,前者是单个字符,后者是字符串,鄙视那些,问“字符和字符串有什么区别?”的人,不知道字符和字符串的区别,那你吃过羊肉串吗?单个羊肉

块能叫串吗,多个羊肉块串起来才叫串,所以字符是单个,字符串可以是多个字符组成的数组(最后有一个结束符号\0),羊肉块串起来一烤就叫烤羊肉串,字符

串一拷,叫拷贝串,学计算机哪有那么简单,要是我开个学校,入学前要体检,测视力,量身高体重,....,三围什么的,不行的pass。

仔细看上面的图,每一个字符都有一个地址,它们的跨度是1(字节),数组的每个元素都可以通过下标来访问,下标(index,

for循环变量经常用i就是因为这个东西)其实就是他在数组中的位置,也就是他的号,拉10个人过来,报数,1,2,3.....,只不过,c语言里数组

的下标是从0开始的,在计算机里面能访问的最小单位就是字节了,也就是地址只能找到以字节为单位,不能再精确了。数组名a和变量名道理上是一样的,在编译

时就和数组的首地址绑定上了,a就是数组的首地址,变量名和数组名其实都是方便人们记忆而取的代号,它在**反汇编后,其实不存在变量名的,回想下,访问

数据有两种方式,既然反汇编后的**不存在变量名,只能通过那种方式访问数据了,那就是地址。数组中的每一个元素,可以被看成一个变量(回想下变量的特

点),因此其可以被读,写,修改,爱怎么得瑟怎么得瑟,你只要不把房间拆了(内存空间),怎么折腾都行。每一个元素的地址都可以通过首地址的偏移量

(offset这个词记住,四级里没有)来算出来,这个偏移量说白了就是下标了。比如上面的图中:'c'所在地址0x28c5,相对首地址0x28c3的

偏移量是2,那a[2]也可以访问'c'了,注意一点,a代表数组,代表数组的首地址,代表数组第一个元素的地址,这“****”

一定要记住。那a+1呢,a是****,那它是第一代表还是第二个代表,还是第****呢?这儿的a应该是第一个元素地址的意思表示的意思应该

是&a[0],a+1是个地址的算术运算,而数组是个一维数组,数组中每个元素都是一个字符,a+1就是a当前地址0x28c3的下一个元素的地

址0x28c4(结合图来看),也就是'b'的地址,如果a是一个二维数组名的话,那么二维数组被编译器理解为一个一维数组,一维数组里的每一个元素是一

个一维数组

c语言中,a[1]为什么和*(a+1)等价?

3楼:匿名用户

a[1]是数组的第2个元素(第一个是a[0]), 所以 a[1]的地址是数组的首地址+1,数组的首地址也可以用 a 表示,所以 a+1是 a[1]的存放地址,所以*[a+1]=a[1]

4楼:匿名用户

a[1]的值存在a+1这个地址中*(a+1)就是取出这个地址中的内容,他们都是同一个东西当然值都一样

数组名a+1和&a+1的区别

5楼:匿名用户

c/c++里面的数组名字会退化为指针,所以数组名a实际指的是数组的第一个元素的地址。而数组名作为指针来讲有特殊性,它正在它所指向的内存区域中,&a的值和a的数值是相同的(可以输出观察一下),但是类型和意义不同。而指针的加法操作和指向的数据类型密切相关。

比如:int a[10]; a就相当于int *,如果是对它加1(a + 1)是相当于a + 1 * sizeof(int)。但是&a的类型则相当于int **,是所谓指向数组的指针,是数组元素类型的二级指针,对它加1是相当于 &a + 1 * sizeof(a)的,所以会偏移一个数组长度。

c语言菜鸟求教:请问下面这段解释中“*(a+1)表示的是数组a[1]中第一个元素的地址”是不是错的

6楼:奋力冲

对啊,*(a+1)就是表示a[1]的存储位置的,*(a+num)表示的实质就是a[num],只是写法不一样,*(a+num)更接近本质。

7楼:匿名用户

他没错,你也没说自错,但你理解不到位。

*(a+1)是数组元素。但a是二维数组,那你就要再进一步理解了。

因为a是二维数组名,即是一维数组a[0] 、a[1] 、a[2] 的首地址。

a+1就是 a[1]的地址。

*是取指针的值。

那么*(a+1)就是取 a[1]的值。

它是什么呢?它又是一个数组: a[1][0], a[1][1] ,a[1][2]。

而且 a[1]是它们的首地址。

即 a[1]的值就是 a[1][0]的地址。

8楼:野兽fight美女

是错的,a表示的是啊a[1]的首地址

c语言中的二维数组里a+1和*(a+1)为什么都是地址

9楼:刘文正粉丝

二维数组, int a[10][20];

a是一个指针的指针, 即二级指针.

一个指针加一个数, 当然还是指针(即a+1是指针)

取值一个二级指针, 是一级指针(即指针), 所以还是指针, 不过类型发生了变化.

a+1的类型为int *[10].

而*(a+1)的类型则为int *, 也就是平常的指针.

如果你学习二维数组是用心, 你就会知道不存在二维数组, 二维数组其实是一个包含数组的数组, 即数组的每一个元素还是一个数组(这点有点像面向对象的思维).

所以a[0]就是取第一个元素值, 而第一个元素是数组, 所以其值仍是一个指针.

答了这么多, 一看问题, 发现是"地址".....地址和指针是一个东西.

10楼:zh呼啸而过

例如a[5][10];

a + 1的值是第二行的首地址,

* (a + 1)得值也是第二行的首地址,但是a + 1不等于a[1],而* (a + 1)等于a[1]。

如果给a+1再加1,就是a+1+1,就是a+2,它的值是第三行的首地址

如果给*(a+1)再加1,就是*(a+1)+1,它的值是第二行的第二个地址

他们移动的区别:前者是纵向的,后者是横向的。

指针类型的区别:两者均存放为同一地址,但前者是指向一维数组,后者是指向元素的。

实际就是前者每次跳动4*10个字节,后者每次跳动4个字节。

11楼:twinkleh丶

a+1应该是 (a+0)+1

这里的a是二维数组中的二级指针

数组名为a[0]的一维数组(表示行)

也是数组名为a的一维数组(表示列)

后面的1表示行数组移动1行

0表示列的移动

所以是1行0列的地址

*(a+1)中a是二级指针

取值二级指针是一级指针

一级指针指向的一维数组(二维数组中的行)

一维数组移动一位只能是向下移动也就是行,

所以就是 第一行的首地址 也就等于二维数组中 第一行零列的地址

12楼:tlier丿残刀

二维数组又包含多个一维数组 a指向第一个一维数组的首地址就还是地址

C语言,定义二维数组a,则(a+1)表示什么a+5)表示什么

1楼 倒霉孩子改名啦 a 1 相当于a 0 1 , a 5 相当于a 0 5 已经越界了 c语言 二维数组 a 1 1 和 a 5 分别表达什么? 2楼 匿名用户 a 1 a 1 那么 a 1 1 a 1 1 a 5 a 5 c语言定义了一个二维数组a 5 3 用循环实现a 0 0 a 1 0 a ...

为什么.数组元素a与a+i的表示等价

1楼 匿名用户 a是存储的是数组首地址, a指向的就是数组第一个元素a 0 所以 a i 的地址和a i 的地址一样。数组和指针在一定程度上本质是一样的。 2楼 只有a是二维数组时,a i 与a i才等价,他们都表示第i行的首地址,且类型相同。当a为一维数组时,他们并不等价。 3楼 司燕舞景鑫 不等...

c语言二维数组a,为什么a和(a+1)等

1楼 a 1 指针取得不就是地址吗 2楼 匿名用户 a 1 是定义的指针, 因为数组的起始地址a 0 可以用a来代替 所以a 1 和 a 1 是同一个地址 3楼 首先a代表整个数组的首地址没问题吧,a 1就是把地址下移, a 1 就是取其地址的内容。这回可以理解了吧! c语言中二维数组a i j 为...