个人主页:小田爱学编程
系列专栏:c语言从基础到进阶
关注博主,随时获取更多关于c语言的优质内容!
欢迎来到小田代码世界~
喜欢的小伙伴记得一键三连哦 ૮(˶ᵔ ᵕ ᵔ˶)ა
目录
一. 解决疑问
二.数组名的理解
二.使用指针访问数组
三.传参的本质
四.一维数组传参的本质
五.排序
六.assert断言
七.二级指针
八.指针数组
九.字符指针变量
十.数组指针
十一.函数指针
十二.函数指针数组
十三.烧脑问题
上次,我们提出了在函数中我们学过函数,形参是实参的一份临时拷贝,也就是在函数中的形参再怎么改也不会影响实参,那为啥会出现下面的情况呢?
如果你想知道这个问题的答案,那么你看完这篇文章,你一定会发现问题的答案的。
数组名就是数组首元素的地址
☀特例:1.sizeof中单独放数组名,即sizeof[arr]中的不是数组的首个,而是整个数组
☀特例:2. &arr这里的数组是整个数组
从上述例子我们可以看出,数组首个首元素的地址和整个数组的地址就会有明显的差别
p[i]=i[p]=arr[i]=*p=*i
为啥这个不起作用呢?
由打开调试可知,a,b,x,y的地址不一样,这就比如我和你在不同的房间(这个房间离得很远),我和你也不认识,那当然你做什么肯定不会影响我呀,这里的同样是一个道理,我们这样紫就更加的加深了我们对形参是实参的一份临时拷贝的理解了,我们现在学习了指针,就可以进行修改喽
⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。
迈入算法的大门,从排序开始,从冒泡排序开始:
视频:
C语言冒泡排序和选择排序(这应该是讲的最详细的一个视频了)
思路:
排序的构建方法有很多,一种就是比较相邻的元素
代码:但是,如果一组数是0,1,2,3,4,9,8,7,6,5按照升序去排序,如果本身有的数字为有序,那么再去 比较会导致效率降低:我们引入count计数器,发现按照上方的算法排序,需要45次
我们可以用flag进行判断,先假设有序,如果有序就排序,没序就跳出循环
#define NDEBUG
#include
assert表示判断的意思
加入宏#define NDEBUG,可以自动取消assert断言的使用(在release版本)会出现
二级指针变量存放一级指针变量的地址:int**pa=&a
**pa ->可以找到a并把a的值给改变
是一群指针放在数组里面,构成的指针数组
指针数组举例:int* parr[3] = {arr1, arr2, arr3};
int main()
{
char ch = 'w';
char *pc = &ch;
*pc = 'w';
return 0;}
字符指针变量不可变,在内存中申请空间时同一串常量申请的空间相同
数组指针:指向数组的指针,eg int(*pa)[10]=arr,解释:pa是数组名,*p是指这个是指针变量, 有十个元素,且指向的对象是int类型,准确的说其类型是:int(*)[10] ,或这个是个数组指 针,类型是int(*)[10]int(*)[10]
[]的优先级要⾼于*号的,若是int*p[10]=arr,则是指针数组
⼆维数组传参本质上也是传递了地址,传递的是第⼀⾏这个⼀维数组的地址
void test(int (*p)[5], int r, int c)
⼆维数组传参,形参的部分可以写成数组,也可以写成指针形式,同样一维数组等同
指针指向的对象是函数
格式:
地址存到⼀个数组中,那这个数组就叫函数指针数组
int (*parr1[3])();
通过以上的学习:想必大家已经对这两个问题可以做出很好的解释:
(*(void (*)())0)();
void (*signal(int , void(*)(int)))(int);
如果想知道答案,请持续关注系列专栏:c语言从基础到进阶
今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,您的支持就是我前进的动力!