冷眼观world 2021-05-05 13:44 采纳率: 100%
浏览 65
已结题

【二维数组问题】二维数组名含义问题

一直没搞懂二维数组名含义以及延申的各种地址问题,在网上搜集相关资料发现很多是这样讲的:假设一个二维数组a[3][3]

a代表首行地址,一般用a[0][0]地址表示;

&a代表整个数组的地址,一般用a[0][0]地址表示;

a[i]代表第i行起始元素的地址;

&a[i]代表第i行的地址,一般用a[i][0]地址表示;

但是我自己写了段代码求证发现并不是这样

#include <iostream>
using namespace std;
int main()
{
	int a[3][3] = {
		{1, 2, 3},
		{4, 5, 6},
		{7, 8, 9}
	};
	cout << "sizeof(a): " << sizeof(a) << " address: " << a << endl;
	cout << "sizeof(&a): " << sizeof(&a) << " address: " << &a << endl;
	cout << "sizeof(a[0]): " << sizeof(a[0]) << " address: " << a[0] << endl;
	cout << "sizeof(&a[0]): " << sizeof(&a[0]) << " address: " << &a[0] << endl;
	cout << "sizeof(a[0] + 1): " << sizeof(a[0] + 1) << " address: " << a[0] + 1 << endl;
	cout << "sizeof(&a[0][1]): " << sizeof(&a[0][1]) << " address: " << &a[0][1] << endl;
	system("pause");
	return 0;
}

输出如下:

可以看到sizeof(a)有36字节,显然是整个数组地址的意思。但是不知道为什么sizeof(&a)为什么只有4?还有a[0]和&a[0],按照输出,a[0]应该表示第0行这一整行的地址,&a[0]应该是第0行首元素的地址?哪个才是对的,到底该听哪个的呢?

  • 写回答

4条回答 默认 最新

  • 小白小白你好菜 2021-05-05 14:57
    关注

    先说第一个,sizeof(a)不是指整个数组地址,而是指这个二维数组所占内存的大小,因为你的是int整型数组,每个整型占4个字节,一共9个元素,所以占36个字节;
    再说sizeof(&a),这个求解的是数组a所在的地址占的内存大小,这里你可以理解成指针,因为指针的本质就是地址,你可以去百度查,规定指针类型的内存大小为你使用的计算机的位数所占的字节,这里我猜测你的电脑应该是32位即4字节的,所以显示为4;我的电脑使用64位,所以显示为8;
    再来说a[0]、&a[0]、a、&a的地址关系,数组在C语言中是顺序排列的,所以最开始的元素不就是a[0][0]吗,同时这个元素所占的地址不也是整个数组的起始地址a吗,同时c语言里面数组名是可以当地址使用的,&a的地址即为a的地址。a[0]是二维数组的第一个一位数组,那么它即是一个数组名,也可以当做地址使用。
    这些地址都是对的,你用哪个都可以,具体使用哪个无非是看你题目的要求。你的a[0]+1和&a[0][1]都是指元素a[0][1]所在的地址,所以地址显示相同
    这里特别重要的知识点就是,当有&或者*符号时,都是当做指针来计算,指针的大小与你的类型、长度无关,只与你的操作系统所占位数有关
     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月26日

悬赏问题

  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献