[C语言]二维数组与指针
二维数组与指针
1 二维数组初始化
以下几种赋值方式均可。
int a[4][4] = {0};
int a[4][4] = {1,2,3,4,5,6};
int a[4][4] = {{1,2,3},{4,5},6} //其他元素都为0;
int b[][4] = {{1,2},{3,4}}; //第一维可以省略,第二维不能省略
2 遍历
//用一个for遍历
int c[3][4];
for(int i = 0; i<12; i++)
c[i/4][i%4]=i;
//用两个for遍历
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%4d",c[i][j]);
}
printf("\n");
}
3 用数组名访问
对于int a[3][4];
a是数组名,是第0行第0个元素的地址。
用加号(+)(偏移量)的方式得到的都是地址,不是元素!
a + i是地址,a[i]+j也是地址!
a[i]是第i行的起始地址,a[i] == a + i == &a[i][0[
.
a[i][j]是第i行的第j个元素, a[i][j] == *(a[i] + j) == *(*(a+i) + j)
4 用int *指针访问
int arr[5][5];
int *parr = (int *)arr;
int count = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
arr[i][j] = count++;
}
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
printf("%3d",*(parr+i*5+j));
}
printf("\n");
}
4 * 用指向数组的指针访问
int arr[5][5];
数组名arr不是二级指针!二维数组不等于二级指针!
二维数组arr可用看作是5个一维int[5]数组在内存里连续堆叠形成的,因此若想用指针来访问,需要定义一个指向int[5]数组的指针。
int (*ptrarr)[5];
ptrarr = arr; // arr == arr[0] 二维数组的起始地址
或者
int (*ptrarr)[5] = arr;
ptrarr
是一个指针,指向int[5]数组。
*ptrarr
是一个int[5]数组,是这个数组的数组名,因此访问该数组内的元素的方法是 (*ptrarr)[i]
或者是 *((*ptrarr)+i)
。这里要注意,前者的写法不能写成 *(ptrarr)[i]
,因为 [ ] 和 ( ) 的优先级是高于 * 的。
PS: ptrarr
与 *ptrarr
的值是相同的,但是意义不同。他们的值都是arr[0]的地址,但是 ptrarr
是指向数组的指针, *ptrarr
是数组名。
因为 ptrarr
是一个指向int[5]数组的指针,所以 ptrarr
可以进行加减运算,当 ptrarr = arr[0]
时, 执行 ptrarr++
后, ptrarr
就指向了 arr[1]
。因此可以用 *(ptrarr+i)
来表示arr[i]。
若要表示二维数组中的元素,可以采用以下几种方式:
ptrarr // 指针
*ptrarr //int数组
*(ptrarr+i) // 二维数组中第i个一维数组
(*(ptrarr+i)+j)//第i个一维数组中第j个元素的地址
*(*(ptrarr+i)+j) == (*(ptrarr+i))[j] == *(ptrarr[i]+j) == ptrarr[i][j] //第二个写法一定要加括号,否则[j]先于*取值运算
当指针用 [i] 运算时,等同先加偏移量再取值。
下一篇: 求100以内的素数
推荐阅读
-
pic单片机c语言入门基础知识(pic单片机与51的区别)
-
C语言中值得深入知识点----数组做函数参数、数组名a与&a区别、数组名a的"数据类型"
-
c#两种方式调用google地球,调用COM API以及调用GEPLUGIN 与js交互,加载kml文件,dae文件。将二维高德地图覆盖到到三维谷歌地球表面。
-
java与c语言的区别有哪些(全面分析这3个基本区别)
-
php利用array_search与array_column实现二维数组查找
-
C# 16进制与字符串、字节数组之间的转换
-
C语言算法书籍推荐(算法与数据结构书籍推荐)
-
习语言是什么有什么用与C语言的关系?
-
C#语言中条件与&&与条件或||的区别
-
C语言算法书籍推荐(算法与数据结构书籍推荐)