看了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 打赏 收藏 转发到动态 举报
写回复
用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

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧