社区
C语言
帖子详情
看了2维数组和指针,有几句话不明白 请教!!
l12456789
2005-01-22 03:02:07
比如说 定义个这样的2维数组a[2[3]
表示二维数组
a:指向二维数组的指针类型
表示第i行:
a[i]、*(a+i):指向一维数组的指针类型
表示第i行j列的元素:
a[i][j]、 *(*(a+i)+j)
*(a[i]+j)、(*(a+i))[j]:char类型
注意a和*a都是指针,但是基类型不同 ???基类型不同什么意思 能给解释一下吗?谢了!
注意*(a+i)和*a+i的区别?有什么区别?..
...全文
249
20
打赏
收藏
看了2维数组和指针,有几句话不明白 请教!!
比如说 定义个这样的2维数组a[2[3] 表示二维数组 a:指向二维数组的指针类型 表示第i行: a[i]、*(a+i):指向一维数组的指针类型 表示第i行j列的元素: a[i][j]、 *(*(a+i)+j) *(a[i]+j)、(*(a+i))[j]:char类型 注意a和*a都是指针,但是基类型不同 ???基类型不同什么意思 能给解释一下吗?谢了! 注意*(a+i)和*a+i的区别?有什么区别?..
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
20 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
coolsunshine
2005-01-24
打赏
举报
回复
其实为了加强理解,可以把这些地址都输出来,就清楚多了
Henry0
2005-01-24
打赏
举报
回复
xuelong_zl(磊)
说的很正确
l12456789
2005-01-23
打赏
举报
回复
楼上的来做广告?..
lemonal
2005-01-23
打赏
举报
回复
大家解释得好些详细阿,顶一下!
l12456789
2005-01-22
打赏
举报
回复
有机会加我q 向楼上的请教 行不?116097851~~
bigmouse2002
2005-01-22
打赏
举报
回复
#include <iostream>
using namespace std;
int main()
{
int a[5][5] =
{
3, 44, 1, 7, 8,
46, 5, 6, 5, 4,
5, 54, 4, 4, 1,
32, 45,78, 95,54,
21, 4,74, 64,12
};
cout << a << " " << *a << " " << &a[0][0] << endl;
cout << *a + 3 << " " << *(a + 3) << " " << *(*a + 3) <<" "<< *(*(a + 3)) << endl;
//结果
// 0012FEEC 0012FEEC 0012FEEC
// 0012FEF8 0012FF28 7 32
// *(a+i) a数组的地址,所以是地址增加i个类型长度对应的对应的对象
// *(a+i),第一次解引用,在*范围内是加行,*外否则是加列,这里可以
// 看作*(a+i)+0 ,位置在&a[i][0],要再解一成引用变成*(*(a+i))才是对
// 应二维数组的内容,这里是对应a[i][0];可以看成*(*(a+i)+0)
//
// *a+i 同理看成*(a+0)+i 第一次解引用,加在a上是加行,不在a的的括号
// 范围是加列长度,a+0指第0解引用后,*(a+0)是第0行 ,即&a[0][i]的位置。
// 后面的i是加列的地址,整个就是 等于&a[0][i],再解一次引用*(*(a+0)+i)
// 等于a[0][i]记住,第一次开引用在*范围内是加行,*范围外否则是加列,,
// 第二次引用在*范围内解到的是对应的对象!*外是对象对应的值的加减!
//看到一个*就可以定地址了,如果表达不完全,对应位加0 ,在*范围内是加行,*外否则是加列
//*a 看成 *(a+0)+0 ,地址已经很明显了, 再一个解引用*(*(a+0)+1)就是对应地址的值
//*a+1 补0: *(a+0)+1 确定地址 在a[0][1]处,再解引用就是a[0][1]的值
//*(a+2) 补0 *(a+2)+0 确定地址 在a[2][0] ,再解引用就是a[2][0]的值
return 0;
}
jiabin1117
2005-01-22
打赏
举报
回复
*(a+i)可以表示数组中第i+1个元素的地址,也可以表示第i+1个元素的值。因为数组元素的首地址可以表示这个元素的值,也可以表示这个元素的地址。
*a+i表示数组a[i][j}中第i+1个元素的地址。*a表示数组的第一个元素的值或者地址。*a+i表示指针a在内存中增加i个存贮单位,它等价于&a[i],即数组a的第i+1个元素的存贮地址。
总结:在多维数组中,*a的形式可以表示具体的值也可以表示数组在内存中的存贮地址。*a+i只能表示数组a[i]在内存中的存贮地址。
以上是个人所见。仅仅供参考。
l12456789
2005-01-22
打赏
举报
回复
您好牛 有机会切磋!又有感觉了!...
bigmouse2002
2005-01-22
打赏
举报
回复
*(a+i) a是地址,所以是地址增加i个类型长度对应的对应的对象,*(a+i)由于才解一次引用,所以还是地址,位置在&a[i][0],是第i行的首地址要*(*(a+i))才是对应二维数组的内容,这里是,第i行(第一行从0开始)第0个元素,对应a[i][0];可以看成*(*(a+i)+0)
*a+1是a是数组的的首地址,*a是第0行的首地址,*a+1就是第一行首地址增加n个类型长度,即&a[0][i]的位置。再解一次*(*a+i) 才是等于a[][]
看到一个*就可以定地址了,如果表达不完全,对应位加0 ,在*范围内是加行,*外否则是加列
*a 看成 *(a+0)+0 ,地址已经很明显了, 再一个解引用*(*(a+0)+1)就是对应地址的值
*a+1 补0: *(a+0)+1 确定地址 在a[0][1]处,再解引用就是a[0][1]的值
*(a+2) 补0 *(a+2)+0 确定地址 在a[2][0] ,再解引用就是a[2][0]的值
v41dugu
2005-01-22
打赏
举报
回复
●●●给你个绝对清楚的解释:其实对于一维数组很好理解,但是二维数组就要分清楚指针有指向行与指向列之分。如:int a[2][3]={{123},{456}};
在这里表示地址的可以有几种:a+i,a[i],*(a+i),&a[i] 其中a+i和&a[i]是指向行的,而*(a+i)和
a[i]是指向列的。所谓的指向行,是指的变化的最小单位是行,如:a+1或&a[1]就是第一行的首地址,a+2就是第二行的首地址。而不能指向第某行的具体的列,如想通过&a[1]+1或(a+1)+1来指向第一行的第一列就不行。弄懂了上面的,指向列的就好理解了,*(a+1)就是指向第一行的第一列,相当于*(a+1)+0,*(a+1)+1这样就实现了指向第一行的第一列,而*(*(a+1)+1)就是第一行的第一列的内容了,就是5。
bigmouse2002
2005-01-22
打赏
举报
回复
上面是最后一次整理的思绪,前面的帖子不要看!
bigmouse2002
2005-01-22
打赏
举报
回复
*(a+i) a数组的地址,所以是地址增加i个类型长度对应的对应的对象,*(a+i),第一次解引用,在*范围内是加行,*外否则是加列,这里可以看作*(a+i)+0 ,位置在&a[i][0],要再解一成引用变成*(*(a+i))才是对应二维数组的内容,这里是对应a[i][0];可以看成*(*(a+i)+0)
*a+i 同理看成*(a+0)+i 第一次解引用,加在a上是加行,不在a的的括号范围是加列长度,a+0指第0解引用后,*(a+0)是第0行 ,即&a[0][i]的位置。后面的i是加列的地址,整个就是 等于&a[0][i],
再解一次引用*(*(a+0)+i)等于a[0][i]记住,第一次开引用在*范围内是加行,*范围外否则是加列,,第二次引用在*范围内解到的是对应的对象!*外是对象对应的值的加减!
bigmouse2002
2005-01-22
打赏
举报
回复
表示第i行j列的元素:
a[i][j]、 *(*(a+i)+j)
*(a[i]+j)、(*(a+i))[j]:char类型
注意a和*a都是指针,但是基类型不同 ???基类型不同什么意思 能给解释一下吗?谢了!
注意*(a+i)和*a+i的区别?有什么区别?..
//
既然知道a和*a都是能当指针用,那么就好理解了,首先分清指针+n (a+n)和 指针的对象+n (*a+n)的区别指针是地址类似0x0012FF08 这样子的32位地址,指针+n是地址增加n个类型长度,指针的对象+n
才是对象的内容+n,由于2维数组的特殊性,*a不是指针对象而是一个指针,所以*a+n也是地址增加n个类型长度,要再解一层引用才是数组的内容 要*(*a)才等于3
xuelong_zl
2005-01-22
打赏
举报
回复
在没有理解的时候,先用下标引用,是很好理解的,多看看例子,和书上的程序,慢慢就会了
healer_kx
2005-01-22
打赏
举报
回复
多多练习就知道了,其实很简单啊。
而且也不建议你这么用,什么指针,下标的。。。
bigmouse2002
2005-01-22
打赏
举报
回复
a是数组的代表,不管1维还是2维数组,都是首地址,a可以当指针使用,但绝对不是指针。最大的区别是
a不能更改。如果是当成实参传递,接收到的就是对应类型的指针,传的是首地址,数组是绝对不可能
按值传递的(看c++ primer)
二维数组有特殊性,a 首先是整个2维数组的首地址,其次是第0行的首地址,再次是第0行第0列
的首地址,a就是第0行的首地址,*a 就是第0行的首地址 &a[0][0]第0行第0列
的首地址
#include <iostream>
using namespace std;
int main()
{
int a[5][5] =
{
3, 4, 1, 7, 8,
4, 5, 6, 5, 4,
5, 54, 4, 4, 1,
32, 45, 78, 95,
54, 21,4, 74, 64
};
cout<<a<<" | "<<*a<<" | "<<&a[0][0]<<endl;
return 0;
}
l12456789
2005-01-22
打赏
举报
回复
a可是看成一个二级指针,*a就是一级指针了,所以基本类型不同
听过这个说法 但是我感觉还是不很明了 但是谢谢楼上的!!
xuelong_zl
2005-01-22
打赏
举报
回复
注意a和*a都是指针,但是基类型不同 ???基类型不同什么意思
//a可是看成一个二级指针,*a就是一级指针了,所以基本类型不同
注意*(a+i)和*a+i的区别?
//*(a+i)表示第i行的首地址,*a+i表示第一行的第i个元素的地址
这是我的理解,再看看别的高手是怎么说吧
xuelong_zl
2005-01-22
打赏
举报
回复
先up
【C语言进阶篇】
指针
进阶(一)- 字符
指针
&&
指针
数组
&&
数组
指针
呜呜呜好难啊!!!
微软等公司数据结构+算法面试100题
微软等公司数据结构+算法面试100题(第1-100题)首次完整亮相 作者:July、2010年12月6日。 更新:现今,这100题的答案已经全部整理出来了,微软面试100题2010年版全部答案集锦:http://blog.csdn.net/v_july_v/article/details/6870251。 关
微软公司等数据结构+算法面试100题(第1-100题)全部出炉
From:http://blog.csdn.net/v_JULY_v/article/details/6057286 微软等公司数据结构+算法面试100题(第1-100题)首次完整亮相 更新:现今,这100题的答案已经全部整理出来了,微软面试100题2010年版全部答案集锦:http://blog.csdn.net
C/C++笔试题
微软亚洲技术中心的面试题!!! 1.进程和线程的差别。 线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行 (3)拥有资源:进程是拥有资源的独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源. (4
题解 | #输入整型
数组
和排序标识,对其元素按照升序或降序
19届秋招进的,怎么说呢,目前银行金融方向的大环境不是很好,进个好项目965,去行方卷死,996都是舒服的,目前我一直在总部,各方面都还行,现在宇信研发好多部门。关注小助手,更新不迷路!1.上海兆芯,上海,系统建模与性能分析,年包30w左右,965,会偶尔加班,公积金15%,逼签中,两天内给答复做国产CPU,国企,业务比较稳定,公积金高2.浙江。过去四个月一直在打磨项目,简历看上去至少不是千篇一律了,能过HR了,关于项目准备比较充足,但是我选择投递的都是小公司,人家压根就不想问这些,反而问的是一些jav。
C语言
69,382
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章