刘加加在成长(C++语言学习中)

学习、工作、生活,这是三个问题。

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  38 随笔 :: 0 文章 :: 24 评论 :: 0 Trackbacks
一、多维数组地址和指针的关系
int arr2[4][2]={{1,2},{3,4},{5,6},{7,8}};
printf("arr2=%p,&arr2[0]=%p,arr2[0]=%p,&ar2r[0][0]=%p\n",arr2,&arr2[0],arr2[0],&arr2[0][0]);

arr[0][0] (1) arr[1][0] (3) arr[2][0] (5) arr[3][0] (7)
arr[0][1] (2) arr[1][1] (4) arr[2][1] (6) arr[3][1] (8)


上面的程序的结果输出竟然都一样。为什么呢?
首先 arr2 代表的是arr2数组的首地址,所以 arr2的值和 arr2第一个子元素arr2[0]的地址相同,即 &arr2[0];
arr2[0]是含有两个整形元素一维数组的首地址,即&arr2[0][0]的值。
简单的说:arr[0]是一个整数大小对象的地址,arr2是两个整数大小对象的地址。因为整数和两个整数组成的数组开始于同一个地址,所以 arr2 和 arr2[0] 具有相同的数值。

二、指针(地址)运算和多维数组的关系
printf("arr2+1=%p,arr2[0]+1=%p\n",arr2+1,arr2[0]+1);
现在我们知道,arr2 和 arr2[0]具有相同的数值,但是arr2+1和arr2[0]+1为什么数值不一样呢?这是因为,arr2指向的对象大小是两个int,儿arr2[0]所指向的大小是一个int。所以arr2+1的值要比arr2[0]+1的值多一个int大小。

三、使用*对多维数组取值
因为 arr2[0] 是 arr2[0][0]的首地址,所以 *(arr2[0])代表存储在arr2[0][0]的值。同样,arr2是arr2[0]的首地址,*arr就是 arr2[0]的值。但是 arr2[0]也是一个地址,即&arr2[0][0],因此*arr2是 &arr2[0][0]。所以 *&arr2[0][0] 等价于 **arr2。*&arr2[0][0] 可以简化为 arr2[0][0]。所以 arr2[0][0]==**arr2。
简而言之:arr2是地址的地址,所以需要经过两次取值才能取到具体的数值。


学完这个知识点,才发现在指针确实很难懂。
posted on 2008-05-19 22:28 刘加加 阅读(488) 评论(0)  编辑 收藏 引用 所属分类: 学习C语言

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理