黑马程序员技术交流社区
标题:
二维数组 a a[0] a[0][0] &a &a[0] &a[0][0] 区别
[打印本页]
作者:
Northcity
时间:
2015-7-22 21:14
标题:
二维数组 a a[0] a[0][0] &a &a[0] &a[0][0] 区别
#include <stdio.h>
int main(int argc, const char * argv[]) {
int a[2][3]={ 1,2,3,
4,5,6
};
for(int i=0;i<2;i++){
for(int j=0;j<3;j++)
printf("a%d%d=%p\t",i,j,&a[i][j]);
printf("\n");
}
//数组名数组首地址是一个指针常量,指针类型是所指向元素的类型,对应第一个元素的地址,数组名加1等于加了一个相应类型的指针
printf("a地址是:%p\n",a);//数值首地址就是第一个元素地址,二维数组第一个元素是一维数组a[0]
printf("a[0]地址是:%p\n",a[0]);//一维数组地址就是第一个元素a[0][0]的值 &a[0][0]
printf("a[0][0]的地址是%p\n",&a[0][0]);
printf("a+1地址是:%p\n",a+1);//因为二维数组元素是行,所以加1等于加了一行
printf("a[0]+1地址是%p\n",a[0]+1);//一维数组元素是基本类型int,所以加1 等于加了一个基本类型
/*数组名虽然是一个指针常量,但是当用在两个地方时不是指针常量
// 1 sizeof(数组名) 这个计算数组占总字节数
// 2 &数组名 产生一个指向数组的指针
*/
printf("&a地址是:%p\n",&a);//产生一个指向二维数组a的指针
printf("&a[0]地址是:%p\n",&a[0]);//产生一个指向数组a[0]的指针
printf("&a[0][0]的地址是%p\n",&a[0][0]);//就是元素a[0][0]的地址
printf("&a+1地址是:%p\n",&a+1);//指向二维数组a的指针加1等于 跨越二维,所以越界
printf("&a[0]+1地址是%p\n",&a[0]+1);//指向一维数组a[0]指针加1 等于跨越一行
printf("&a[0][0]+1地址是%p\n",&a[0][0]+1);
/*
来看看究极版本
*(*(a+1)+1) 他得值是多少?,如果知道是多少,指针这里就基本懂了.
// 1 a+1 等于指向达数组第二行的指针
2 *(a+1) 就是a[1]
3 a[1]+1 就是 a[1][1]的指针
4 *(a[1][1]) 就是 变量存储值 5
*/
printf("%d\n",*(*(a+1)+1));
return 0;
}
复制代码
作者:
原晓桢
时间:
2015-7-22 21:23
然而还是没有看懂
作者:
普通蜗牛
时间:
2015-7-22 21:36
踩一下 表示已阅
作者:
哒哒萌
时间:
2015-7-22 21:42
好像并没有什么区别,值是相等的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2