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 }

好了,指针和数组就到这儿吧!我也要多找一些题目来做做,争取初步的掌握它!^_^

转载于:https://www.cnblogs.com/NArt/archive/2011/11/29/2267440.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值