黑马程序员技术交流社区
标题: C语言学习笔记之用数组名访问二维数组 [打印本页]
作者: chunhuayun 时间: 2015-9-27 21:06
标题: C语言学习笔记之用数组名访问二维数组
本帖最后由 chunhuayun 于 2015-9-27 22:34 编辑
一、用数组名访问二维数组
如下图
例如:
- int a[][3] = {1,2,3,4,5,6};
-
- printf("sizeof(a) = %ld\n", sizeof(a));
- printf("sizeof(a[0]) = %ld\n", sizeof(a[0]));
-
- printf("a = %p\n", a);
- printf("a[0] = %p\n", a[0]);
-
-
-
- printf("a[0] + 1 = %p\n", a[0] + 1);
- printf("a + 1 = %p\n", a + 1);
- printf("a[1][0] = %p", &a[1][0]);
复制代码
打印结果:
sizeof(a) = 24
sizeof(a[0]) = 12
a = 0x7fff5fbff8f0
a[0] = 0x7fff5fbff8f0
a[0] + 1 = 0x7fff5fbff8f4
a + 1 = 0x7fff5fbff8fc
a[1][0] = 0x7fff5fbff8fc
结论:
由打印结果可知,虽然a的地址和a[0]的地址是一样的,但是由于sizeof(a) 和sizeof(a[0])不一样,所以a+1和a[0]+1的结果是不一样的。a+ 1表示的是第2行的第一个元素,a[0] + 1表示的是第一行的第二个元素
例2:
- int a[][3] = {1,2,3,4,5,6};
-
- for (int i = 0; i < 2; i++) {
- for (int j = 0; j < 3; j++) {
- printf("%d ", *(a[i] + j));
- //printf("%d ", *(*(a + i) + j));//同上
- }
- printf("\n");
- }
复制代码
打印结果:
1 2 3
4 5 6
二、用普通指针访问数组
这样做本身是不对的,因为,假设定义了一个数组
Int a[][3] = {1,2,3,4,5,6};用一个int *p = a;来访问数组a。指针应该指向相同类型的变量,
而此处int类型的指针指向了int[][]类型的数组变量。虽然这样做不会报错,但是一般不可取
三、二维数组指针的定义、初始化
1.二维数组指针变量的定义
1.1 一般形式:
数据类型 (*指针变量名) [二维数组列数];
1.2如果要讲二维数组赋给一个指针,应该这样
- Int a[2][3];
- Int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组
- P = a; // 将该二维数组的首地址赋给p, 也就是a[0]或是&a[0][0]
- P++; //该语句执行过后,也就是p = p + 1,p跨国行a[0]指向了行a[1]
复制代码
所以数组指针也称为 【指向一维数组的指针】,也称为【行指针】
二维数组指针可以替代数组名去使用
1.3 用法如下
- int a[][3] = {1,2,3,4,5,6};
- int (*p)[3] = a;
- for (int i = 0; i < 2; i++) {
- for (int j = 0; j < 3; j++) {
- printf("%d ", *(*p + j));
- }
- p++;
- printf("\n");
- }
复制代码
打印结果:
1 2 3
4 5 6
1.4指针数组和二维数组指针变量的区别
- int *p2[2] = {&a[0][0], &a[1][0]};//p2是一个指针数组
复制代码
区别:二维数组指针是单个变量,其一般形式是“(*变量名)”两边的括号不可少,而指针数组类型表示的是多个指针(一组有序指针)在一般形式“*指针数组名”两边不能有括号,例如:
Int (*p)[3]表示的是一个指向二维数组的指针变量,该二维数组的列数位3或分解为一位数组的长度位3.而int *p[3]表示的是一个指针数组,表示的3个有序指针。
作者: wwf707542865 时间: 2015-9-27 22:07
同学,有些地方看不明白,例二中的输出函数中*(*a[i]+j)是什么意思,没看懂
作者: chunhuayun 时间: 2015-9-27 22:26
a表示的是数组a的第i行的首个元素的地址,a+j表示的是第i行的第j个元素的地址,*(a+j)就是根据地址取a数组第i行的第j个元素的值
作者: cherrycool 时间: 2015-11-8 11:40
/Users/apple/Desktop/(3).png *a , a , a[0] , & a[0] , &a[0][0] 地址值为什么都是一样的?
-
(3).png
(105.38 KB, 下载次数: 12)
作者: tiansongsky 时间: 2015-11-8 11:42
作者: 许本亮 时间: 2015-11-8 13:51
好贴,顶一下
作者: normalwzh 时间: 2015-11-8 23:53
不错支持一下
作者: langjun 时间: 2015-11-9 22:52
迄今为止,你所取得的最大成就是什么?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |