找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4350|回复: 2

【C语言】数组指针的一些问题

[复制链接]

33

主题

1

回帖

561

积分

用户组: 大·技术宅

UID
580
精华
26
威望
28 点
宅币
341 个
贡献
0 次
宅之契约
0 份
在线时间
8 小时
注册时间
2014-12-8
发表于 2015-1-20 23:45:36 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 0x55AA 于 2015-1-20 23:47 编辑

1.jpg
  1. #include <iostream>
  2. using namespace std;
  3. void main()
  4. {
  5.         int arr[2][3]  = {1,2,3,4,5,6};
  6.         int (*p)[3] = arr;
  7. }
复制代码
分析二维数组int arr[2][3],它在内存中是顺序存储,分别按照行列来存贮,从arr下拉的可以看出,arr直接的有两个元素,分别是arr[0],arr[1],可以看出其类型是 int[3],这是一个数组,那么arr[0],arr[1]就代表着两个数组,表示的数组的首元素地址。
至于arr = arr[0] = &arr[0][0] = arr +0,以及arr + 1 = arr[1] 这些都还好理解。关键是 &arr[1] = arr[1] =*(arr + 1),这个该怎么理解呢。arr[1] 表示数组arr的首地址加上一个偏移量所指向的值,即*(arr + 1),所以*(arr + 1) = arr[1] = arr +1,这就是数组中指针的感觉有点奇怪的地方吧。其实本来就是这样,我们还可以这样理解,数组中的元素是按顺序存储的,那么arr + 1表示的第1(0,1)个元素的地址。*(arr + 1)表示的第1个元素的值,因为第一个元素是数组,那么数组的值使用首元素的地址表示的,那么对其进行解引用操作,结果肯定就是arr+ 1自身表示的地址了。或许有人感到奇怪,为什么*(arr + 1)代表的不是(arr+1)处的即第一行首元素的地址呢。我是这么思考的,arr + 1 所指的类型是int[],所以其解析成地址,而arr[1][0]的地址虽然是和arr + 1相同,但是两者表示的类型的不同。
我们知道&只是个取地址符号,如果针对一个一维数组来说,&a[i ]表示的是第i个元素的地址,这个毫无疑问,但是针对多维数组呢?在数组 arr[2][3]中,arr[1]表示的第一个元素的地址,也可以说是表示第1行数组,&arr[1]表示的是什么东西呢,这个问题的本质其实就是数组名,对数组名取地址两者的区别。看下面的程序
  1. #include <iostream>
  2. using namespace std;
  3. void main()
  4. {
  5.         int brr[3] = {1,3,5};
  6.         cout<<"brr 的大小:"<<sizeof(brr)<<endl;
  7.         cout<<"&brr 的大小:"<<sizeof(&brr)<<endl;
  8.         cout<<"brr's  address is:"<<brr<<endl;
  9.         cout<<"&brr's address is:"<<&brr<<endl;
  10.         cout<<"brr + 1's address is :"<<(brr + 1)<<endl;
  11.         cout<<"&brr+1 's address is :"<<(&brr + 1)<<endl;
  12. }
复制代码
再看结果:
1.png
我们发现,brr表示的地址和&brr表示的地址两者相同,但是对两者进行+1操作的话,会发现,brr只是加了4个字节,但&brr却是加了4X3个字节(整个数组的大小)。到现在应该明白了两者的区别了吧,brr数组名表示地址,但是只等同于&brr[0],即,&brr表示的是整个数组的地址,两者虽然数值一样,但是类型不一样。
其实这里涉及到了一个隐式转换的问题。对于C++中的数组,除了在sizeof(array),&array外,数组名array都会被自动转换成&array[0].

本帖被以下淘专辑推荐:

回复

使用道具 举报

1111

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24241 个
贡献
46222 次
宅之契约
0 份
在线时间
2297 小时
注册时间
2014-1-26
发表于 2015-9-30 12:15:53 | 显示全部楼层
C语言可没有namespace,那是C++的
回复 赞! 靠!

使用道具 举报

0

主题

41

回帖

45

积分

用户组: 初·技术宅

UID
3351
精华
0
威望
2 点
宅币
0 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2018-1-14
发表于 2018-1-14 15:44:20 | 显示全部楼层
可以可以!!
回复

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-24 13:45 , Processed in 0.050047 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表