C 学习笔记 - 指针(二):指针和数组 (下)
昨天总结了关于 "指针和一维数组" 一些知识点和简单的用法,并最终以一个输出指定一维数组的元素的函数而结束。
其实,想要理解指针与数组这一块,也不是什么难事,关键有这么几点要搞清楚:
1. 数组名;不管是一维数组、二维数组还是N为数组,都必须能够清晰的判断出它们的数组名的的含义。
2. 数组下标与数组元素指针之间的关系;这点也非常重要。
3. 指针变量的运算;
只要了解这三点,我想理解指针与数组之间的关系就没什么太大的问题了。
^_^
下面来看一个例子:
int a[4][5];
int * p = a; [error]
乍一看,这两行代码没什么问题。如果不能理解数组名的含义,估计也看不出来错误。
变量 p 是声明为一个指向整型的指针,而 a 在此处并不是一个指向整型的指针,而是一个指向整型数组的指针。
所以 将一个指向整型数组的指针 赋给 一个指向整型的指针 肯定是错误的!
那我们如何声明一个指向整型数组的指针变量呢?
int (*p)[5];
这个声明看起来似乎很复杂,其实很好理解。我们假定它是一个表达式并对它求值。
下标引用的优先级高于间接访问,但由于括号的存在,首先执行的还是间接访问[(*p)],所以 p 是个指针变量,那它指向什么呢?
当我们对它执行间接访问操作的时,我们得到的是一个数组,对该数组进行下标引用得到的是一个整型值,所以 p 是指向整型数组的指针。
我可以对它进行初始化:int (*p)[5] = a; => 它使p指向a数组的第一行
所以,p 在此处是一个指向拥有 5 个整型元素的数组的指针。
^_^
那我们又如何获取二维数组 a 的第一个整型元素呢?
int * i = &a[0][0];
int * i = a[0];
这两种方式都可以!
我们也可以使用多为数组作为函数的参数,那又该如何呢?
void func(int (*p)[10]);
void func(int p[][10]);
可以使用两种方式的任何一种!
下面看一个例子:写一个函数,让它输出指定二维数组的元素
1 # include <stdio.h>
2
3 void printIntDimensionalArrayElements(int intDimensionalArray[][5], int arrayLength);
4
5 int main(void)
6 {
7 int d[4][5] = {
8 {1, 2, 3, 4, 5},
9 {-1, -2, -3, -4, -5},
10 {6, 7, 8, 9, 10},
11 {-6, -7, -8, -9, -10}
12 };
13
14 //将 数组名 d 传递给函数,其实 d 是二维数组元素中的第一个一维数组的地址,4 是二维数组元素的个数
15 printIntDimensionalArrayElements(d, 4);
16
17 return 0;
18 }
19
20 void printIntDimensionalArrayElements(int intDimensionalArray[][5], int arrayLength)
21 {
22 int i, j;
23
24 for(i = 0; i < arrayLength; ++i)
25 {
26 for(j = 0; j < 5; ++j)
27 {
28 printf("%-5d", intDimensionalArray[i][j]);
29 }
30 printf("\n");
31 }
32 }
好了,指针和数组就到这儿吧!我也要多找一些题目来做做,争取初步的掌握它!^_^