C++,二维数组与指针,二维数组名是不是首地址?

C/C++ 专栏收录该内容
154 篇文章 0 订阅

答: 是首地址,是数组的首地址,虽然值等于第一个元素的地址,但是不代表元素的地址.

1. 数组名都是地址常量,都是首地址,可以直接付给指针,但是一维数组和二维数组名 赋予指针时有点不一样.

2.数组名不是指针,它仅仅是个 地址常量

3. 一维数组的数组名 直接付给指针, 如 int a[3]; int *p=a;

4. 二维数组名 直接赋给指针 就错了... 如 int a[3][4]; int *p =a;  就是错误的;  int *p = a[0] ; 就对了. 

5. 二维数组 对应的是二维数组的指针, 这样定义: int (*p) [4]  ;  p=a 就对了

#include <iostream>
#include <string>
using namespace std;

void main()
{
	int a[3][4]={
		{1,2,3,4},
		{5,6,7,8},
		{9,10,11,12}
	};
  
	int * p ; 
	     // p=a ;  错误
		p =a[0]; // ok
	for(int i=0;i<12;i++)
		cout<<*(p+i)<<"--------"<<p+i<<endl;
		
	cout<<a<<endl;   // a 与a[0]地址是一样的.
	cout<<a[0]<<endl;
}

 

 为什么 p=a 是错的.?

 

//  2012-10-9 23:35 重新编辑:

//test20121209.cpp

#include <iostream>
#include <string>
using namespace std;

void main()
{
	int a[3][4]={
		{1,2,3,4},
		{5,6,7,8},
		{9,10,11,12}
	};
	
	int * p ; 
	// p=a ;  错误
	p =a[0]; // ok
	for(int i=0;i<12;i++)
	cout<<*(p+i)<<"--------"<<p+i<<endl;
	
    cout<<"-----------------------"<<endl;
	cout<<"a     = "<<a<<endl;      // 发现 a与a[0]地址是一样的 : 0012FF50
	cout<<"a[0]  = "<<a[0]<<endl;
	cout<<"*a    = "<<*a<<endl;


    // 下面3条原以为是输出的元素的数值,结果 *a还个地址,且与a一样的值
	//  可见二维数组的名 是个 二级指针, a 是地址的地址 
	cout<<"-----------------------"<<endl;
	cout<<"(*a)     =  "<<(*a)<<endl;          // 对应元素1的地址   0012FF50
	cout<<"(*(a+1)) =  "<<(*(a+1))<<endl;      // 对应元素5的地址   0012FF60
	cout<<"(*(a+2)) =  "<<(*(a+2))<<endl;      // 对应元素9的地址   0012FF70

    cout<<"-----------------------"<<endl;
	cout<<"*(*a)      = "<<*(*a)<<endl;          //1   
	cout<<"*(*(a+1))  = "<<*(*(a+1))<<endl;      //5
	cout<<"*(*(a+2))  = "<<*(*(a+2))<<endl;      //9


	cout<<"-----------------------"<<endl;
	cout<<"a[0]     =  "<<a[0]<<endl;     // 对应元素1的地址   0012FF50
	cout<<"a[1]     =  "<<a[1]<<endl;     // 对应元素5的地址   0012FF60
	cout<<"a[2]     =  "<<a[2]<<endl;     // 对应元素7的地址   0012FF70

}

 

//  --- 摘录其他网友的解释:

http://www.programfan.com/club/showpost.asp?id=139457&t=o

片段:
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
    int *p;
    p=a;  //? a是这个二维数组的首地址,但为什么p=a就不行?
    cout<<a<<"\n";
    cout<<p<<endl;

直接“cout<<a”可以看到地址 就是a[0][0]
可是为什么p=a就不行呢?a不是二维数组首地址吗?为什么非要用p=a[0]?
请教!

Ans  ----------->

 数据类型不同
p是指向int的指针
a可以看成指向int [3]的指针
int 和 int [3]不是同样的类型,
前者是简单数据类型,后者是由简单数据类型构成的数组类型.
正因为这两种数据的类型不同,所以指向它们的指针的类型也不同.
指针运算是按照指针的类型进行的,
所以p++只使p移动一个整数所占的字节长度,
a++却移动了三个整数所占的字节长度,
由指针运算就可以看出这两个指针不是同类型的.

不过指针间的强制转换一般都还可行,
因而可以如下:
p=(int*)a;

虽然 a 和 a[0] 的类型不同,但它们的值是一样的.

但值一样却未必是同样的数据类型!

Ans  ----------->

在除了sizeof、&和字符串常量之外的表达式中,array type会被自动转换为pointer type。

对于p=a;这一句,a的类型是array type,就是int[3][3],a在赋予p之前,

其类型先被自动转换为pointer type,就是int(*)[3],转换的结果是指向数组的指针,

而p的类型是int*,是指向整数的指针,两者类型不相容,不能直接赋值。

a[0]的类型也是array type,就是int[3],

同样地,在表达式p=a[0]中a[0]也会先被自动转换为pointer type,

就是int*,跟p的类型相容,因此可以p=a[0]。

 

Ans  ----------->

解释如下:
例如
int a[2][4]是一个二维数组,包含8个元素
这个数组表示为什么呢:
表示为a数组有两个元素(可以想象成一个结构,由4个int组成)
a就是这个数组的指针,指到a这个二维数组的第一个元素,即a[0](4个int组成的)
当你赋值的时候,编译器认为a是一个4元素的结构,而p是一个int指针,类型不匹配,因此错误.
而a[0]则是a[0][0]的地址,a[0]的类型是int *,与p匹配,因此可以.

 

http://www.programfan.com/club/showpost.asp?id=139457&t=o


http://topic.csdn.net/u/20110721/08/a6a212e5-9bd1-496c-819d-3cb207dedc37.html


http://www.docin.com/p-224299099.html


http://blog.csdn.net/yel617/article/details/6923621

 

评论 3 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

sergery

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值