燃烧的指针(二)

个人主页:小田爱学编程
系列专栏:c语言从基础到进阶
关注博主,随时获取更多关于c语言的优质内容!


欢迎来到小田代码世界~
喜欢的小伙伴记得一键三连哦 ૮(˶ᵔ ᵕ ᵔ˶)ა


目录

一. 解决疑问

二.数组名的理解

二.使用指针访问数组

三.传参的本质

四.一维数组传参的本质

五.排序

 六.assert断言

七.二级指针

 八.指针数组

九.字符指针变量

十.数组指针

十一.函数指针

十二.函数指针数组

十三.烧脑问题


燃烧的指针(二)_第1张图片

一. 解决疑问

上次,我们提出了在函数中我们学过函数,形参是实参的一份临时拷贝,也就是在函数中的形参再怎么改也不会影响实参,那为啥会出现下面的情况呢?

如果你想知道这个问题的答案,那么你看完这篇文章,你一定会发现问题的答案的。

二.数组名的理解

燃烧的指针(二)_第2张图片

数组名就是数组首元素的地址

  ☀特例:1.sizeof中单独放数组名,即sizeof[arr]中的不是数组的首个,而是整个数组

  特例:2. &arr这里的数组是整个数组

又有:在这里看出这三种方式没有区别,那区别究竟在哪里?燃烧的指针(二)_第3张图片

燃烧的指针(二)_第4张图片

燃烧的指针(二)_第5张图片

  从上述例子我们可以看出,数组首个首元素的地址和整个数组的地址就会有明显的差别

二.使用指针访问数组

燃烧的指针(二)_第6张图片(*p+i)=(*arr+i)=(p+i)=(arr+i)

p[i]=i[p]=arr[i]=*p=*i

三.传参的本质

燃烧的指针(二)_第7张图片

为啥这个不起作用呢?

形参是实参的一份临时拷贝,但是本质是啥呢?燃烧的指针(二)_第8张图片

 由打开调试可知,a,b,x,y的地址不一样,这就比如我和你在不同的房间(这个房间离得很远),我和你也不认识,那当然你做什么肯定不会影响我呀,这里的同样是一个道理,我们这样紫就更加的加深了我们对形参是实参的一份临时拷贝的理解了,我们现在学习了指针,就可以进行修改喽

燃烧的指针(二)_第9张图片

四.一维数组传参的本质

燃烧的指针(二)_第10张图片

⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。

五.排序

燃烧的指针(二)_第11张图片

迈入算法的大门,从排序开始,从冒泡排序开始:

视频:

C语言冒泡排序和选择排序(这应该是讲的最详细的一个视频了)

思路:

排序的构建方法有很多,一种就是比较相邻的元素

举例:燃烧的指针(二)_第12张图片

代码:燃烧的指针(二)_第13张图片‍但是,如果一组数是0,1,2,3,4,9,8,7,6,5按照升序去排序,如果本身有的数字为有序,那么再去       比较会导致效率降低:我们引入count计数器,发现按照上方的算法排序,需要45次

燃烧的指针(二)_第14张图片

‍我们可以用flag进行判断,先假设有序,如果有序就排序,没序就跳出循环

燃烧的指针(二)_第15张图片

 六.assert断言

  #define NDEBUG
  #include

 ‍assert表示判断的意思

 ‍加入宏#define NDEBUG,可以自动取消assert断言的使用(在release版本)会出现

七.二级指针

燃烧的指针(二)_第16张图片

 二级指针变量存放一级指针变量的地址:int**pa=&a

 **pa ->可以找到a并把a的值给改变

燃烧的指针(二)_第17张图片

 八.指针数组

 ‍是一群指针放在数组里面,构成的指针数组

燃烧的指针(二)_第18张图片

 指针数组举例:int* parr[3] = {arr1, arr2, arr3};

      可以用指针数组来模拟二维数组的实现:燃烧的指针(二)_第19张图片

九.字符指针变量

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,则是指针数组燃烧的指针(二)_第20张图片

 ⼆维数组传参本质上也是传递了地址,传递的是第⼀⾏这个⼀维数组的地址

 void test(int (*p)[5], int r, int c)

 ⼆维数组传参,形参的部分可以写成数组,也可以写成指针形式,同样一维数组等同

十一.函数指针

指针指向的对象是函数

格式:

燃烧的指针(二)_第21张图片

 举例:燃烧的指针(二)_第22张图片

十二.函数指针数组

 ‍ 地址存到⼀个数组中,那这个数组就叫函数指针数组

 ‍int (*parr1[3])();

十三.烧脑问题

燃烧的指针(二)_第23张图片

 通过以上的学习:想必大家已经对这两个问题可以做出很好的解释:

 (*(void (*)())0)(); 

 void (*signal(int , void(*)(int)))(int); 


如果想知道答案,请持续关注系列专栏:c语言从基础到进阶

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,您的支持就是我前进的动力!

你可能感兴趣的:(c语言从入门到进阶,c语言,c++,算法,数据结构,排序算法,c#)