您的位置:首页 > 职场人生

黑马程序员-C-二维数组&指针数组&二维数组指针

2015-08-25 20:29 330 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

一、二维数组:a[3][5]

因为二维数组可以看作是一个特殊的一维数组:每一行的单个元素是一个一维数组。如a[3][5],有3个元素,每个元素是一个含有5个元素的一维数组。所以a[0],a[1]就分别代表第一、二行的地址。

a = &a[0] = &a[0][0] = a[0] —> 第一行地址 = 第一列第一个元素地址

a + 1 = &a[1] = &a[1][0] = a[1] —> 第二行地址 = 第二列第一个元素地址

a + 2 = &a[2] = &a[2][0] = a[2] —> 第三行地址 = 第三列第一个元素地址

a[0] = a = &a[0] = &a[0][0] ——> 第一列地址

a[0] + 1 = &a[0][1] ——> 第二列地址

a[0] + 2 = &a[0][2] ——> 第三列地址

a[0] + 3 = &a[0][3] ——> 第四列地址

a[0] + 4 = &a[0][4] ——> 第五列地址

#include <stdio.h>

int main(int argc, const char * argv[]) {
int a[3][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};    //二维数组
//    由上分析知,a[0],a[1],a[2]也是代表第一、二、三的地址,则a[1]+2代表a[1][2]的地址,即&a[1][2]
//    i代表行,j代表列。则a[i] = *(a + i), a[i][j] = *(*(a + i) + j)
//    遍历数组
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 5; j++) {
printf("%d\t", *(*(a + i) +j));
}
}

//    ************************************************************
/*
一维指针数组定义格式:
类型名称 *数组名[数组长度]
如 int *p[5],表示这个一维指针数组,含有5个指针,这些指针指向整型数据的地址。
记忆方法:运算符的优先级 []大于*,所以其相当于*(p[5]),p[5]是一个数组,说明其首先是一个数组,然后是一个装有指针的数组。它的作用是一个指针集合。
注意:因为此外p是指针数组的首地址,所以其是一个二维指针。

*/
int b, c, d;
b = 1;
int *p[3] = {&b, &c, &d};  //p = &p0 , p[0] = &b
//下面两句代码输出地址相同
printf("%p\n", p[0]);
printf("%p\n", &b);

//下面两句代码输出地址相同
printf("%p\n", p);
printf("%p\n", &p[0]);

//下面两句代码输出地址相同
printf("%d\n", *p[0]);
printf("%d\n", **p);

//因为此外p为二级指针,所以其可以指向二维数组

//    **************************************************************

/*
二维数组指针
1.定义格式: 数据类型 (* 指针变量名称)[指向的二维数组列数]
如 int (*p)[3], 表示指针p可指向列数为3的整型数组。
2.用途
二维数组指针是一个行指针,用来指向二维数组的每一行,存放的是行的首地址

*/
int a3[2][3] = {1,2,3,4,5,6};
int (*p3)[3] = a3;      //给二维数组指针p3赋值,使其指向二维数组a3
//遍历数组a3,可用指针p3代替数组名a3,这在需要变量的情况有用,因为可以p3++,而不可以a3++,因为a3是常量

for (int i = 0; i < 2; i++){
for (int j = 0; j < 3; j++) {
printf("%d\t",*(*(p3+i)+j));
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: