补充:函数指针例子
函数指针及其定义和用法,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
(累死啦!)