Lecture 7. Arrays.

补充:函数指针例子

函数指针及其定义和用法,C语言函数指针详解


1. 

 定义了一个数组,里面有5个int型指针

2. 可变长数组---C99之前肯定是不可以的

        可变长数组是不太安全的

3.  数组中部分元素的初始化,其他默认为0

4. 不能直接把一个数组名赋给另一个数组。通常而言要创建一个和旧的数组一样的新数组,一般来说是要遍历一遍旧数组的。

5.  数组的本质

一定要注意,数组变量名本身是一个地址!是地址!!!

所以要打印元素的值,必须要有星号!!!

 

6. 在用常规循环方法寻找数组的最大值最小值的时候,我们初始化min和max(或者,*min,*max)时,最好要把min设置成很大的数字,把max设置成很小的数字

        而不是习惯性的都设置成数组的索引0

        否则很容易发生逻辑上的错误

7. 在函数内部无法求数组长度的原因:

        我们把数组作为形参传入的时候,编译器把它看成是指针,因此在函数内部sizeof(数组名) 就变成了4,因此sizeof(数组名)/sizeof(数组名[0])  的方法就失效了


8.  一维数组作为函数形参的三种等效方式

 9. 

区分下面三个东西:

        指向常量的指针  const在*的前面

        指向变量的常量指针   *在const的前面

        指向常量的常量指针  *的左右两边都有const

        注意这三种指针在初始化的过程中都有各自禁止的方式!看清楚哪个会导致编译错误!

const int *,const int * const和int const *之间的区别_zsx0728的博客-CSDN博客

10.  二维数组

要求所有元素个数,同理,

11. 动态内存分配 malloc free

二维数组:挨个维度进行分配和释放

12. free(Null)的必要性

13. 第一个函数是把其当作一维数组进行处理

第二个则是把其当作二维函数进行处理


课后反思回顾:

1. 

 

看上面这个,第一个点注意,要打印数组的元素,必须要有*

因为数组名是地址!难道你想打印一个地址吗?!😕

再就是发现,这里地址+1表示下一个索引,+2表示再下一个索引

所以用1来递增即可

这也就是有类似*p++的原因了!!!

2. 关于二级指针

 输出结果是88

很明显,二级指针ptr指向的是一级指针p,一级指针p指向的是array,即array的第一个元素(的第一个元素)9


3.重头戏:二级指针的本质

先看一个例子:

 这两个结果都是88

这个例子可以参照上面的序号13

我们接下来就要探讨:上面这个p到底经历了哪些操作。

先丢一个网址,据说写的很详细

二维数组和二级指针 - 苏苏苏紫Sue - 博客园

这篇文章涉及到下面几个知识点:

(1)二维数组名,并不是一个二级指针,而是一个数组指针。

        如何理解?

         对于一维数组array来说,array就是*array; 

                                                        array[2]就是*(array+2),是一个元素

        对于二维数组matrix来说,matrix就是*matrix,只不过这是一个指针

因为二维数组名只是一个一级指针,指向一个数组。而这个数组,又包含了指向每个一维数组的指针!!!!!

因为二维数组名只是一个一级指针,指向一个数组。而这个数组,又包含了指向每个一维数组的指针!!!!!

因为二维数组名只是一个一级指针,指向一个数组。而这个数组,又包含了指向每个一维数组的指针!!!!!

说三遍哦!很重要!即:名字是指针,指向低维的数组,而这个数组本身的元素又是指针

所以*matrix表示(*指针),代表的是一个指向matrix[0]的指针变量(所以打印出一个地址)

而**matrix代表matrix[0][0]

(2)不管是一维还是多维数组,都是内存中一块线性连续空间

        因此如 arr2[i][j]=*(arr2+(i*col+j)*sizeof(T))

        这样 连续线性的数组访问效率很高

(3) 将二维数组转换成二级指针_baboon_chen-CSDN博客_二维数组转二级指针

这个写的更好👆

(4) 最后的最后,用下面这种方式能够实现“将二维数组名传给二级指针”

实际上是先把二维数组名传给了指针数组,然后指针数组内部又是三个指针

结果:7

结果:6




(累死啦!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值