C-指针1

C语言是一门很强大的语言,他可以直接操作内存,指针就是他可以操作内存的一种方法。

指针是指对象对应的内存地址,读写指针就等于读写内存。

&操作符,又称为取址操作符,将&放在对象名前面,可以获取该对象的内存地址。

数组事实上就是一个指针,他具有长度属性,事实上,随便的一个数的指针也是数组,长度为1而已。指向数组的指针做加减法时,+i等于指针后移i个元素,-i等于前移i个元素,若是超出了数组的长度,称为出界,会导致未知错误,因为被出界的指针很有可能指向的是一个有什么用的变量,不知不觉给人家改了,当然有可能出问题了。有时候,运行良好的程序不一定就没有毛病,只是没爆发而已,养成良好的代码习惯,可以少犯奇奇怪怪的错误。

指针作为普通函数参数使用时,不需要长度,而作为数组参数使用时,需要定义长度。使用指针作为参数与传递给函数,效率会更高,而且不用受限于函数只能return一个结果,可以使用指针传递好几个结果出来。

写一个求数组中最大值最小值的函数如下:

void _max_min(int *p, int len, int *pmax, int *pmin) {
int _max = p[0], _min = p[0];
for(int i = 1; i<len; i++) {
if(p[i]>_max) {
_max = p[i];
}
if(p[i]<_min) {
_min = p[i];
}
}
*pmax = _max;
*pmin = _min;
}

int main()
{
int arr[4] = { 1,2,3,4 };
int _arr_max = 0,_arr_min = 0;
_max_min(arr, 4, &_arr_max, &_arr_min); //此处结果借由指针参数传递出来,得到两个结果
printf_s(“max is %d \n min is %d \n”,_arr_max,_arr_min);
return 0;
}

指针可以传递多个参数出来,是因为指针传递的是地址,不是值,函数运行时如果是传值,他会复制一份在进行运算,而传递指针就不需要复制,直接访问了指针所指向的地址,所以在值比较占内存的情况下,指针作为参数相对相率更高,而且不存在变量无法变更的情况。

递归

递归的定义是程序调用自身的编程技巧。

一直都没弄懂递归到底是怎么调用自身的,C语言函数学习到了递归这一章也还是一知半解。所以还是用实例来练手,总算明白过来了,事实上递归是以函数return出来的结果作为参数进行多次运算,直到结束条件满足为止,中间有任何的dom都不会有影响的。

写了一个简单的除法如下:

function ts(i){
var $new_td = $(“<li></li>”);
$new_td.html(i).appendTo($(“ul”));
if(i <= 1){
return 0;
}
else{
return ts(i/2);
}
}
ts(800);

写函数时究竟在写什么?

刚刚在知乎看到一个问题,为什么你的前端经验不值钱

作者说了“可用”、“健壮”、“可靠”原则,还有“宽容”, 对需求宽容、对用户宽容、对调用者宽容、对维护者宽容。

说的很有道理,但是作者自己写的那个方法,有一半的概率会死机,因为这个函数有可能死循环。

所以,我就在想,到底我们需要怎样写函数,写函数时究竟是在写什么呢?

可用性:可以执行,能处理异常数据、边界问题、还有扩展等;

可读性:妥当的备注,正确的命名,以及流畅的代码思路等;

优越性:减少循环,减少访问内存的次数,减少dom的操作等。

两个字:思路。上文说的作者的函数会死机,我觉得应该是属于作者忽然短路吧,毕竟这个函数多执行几次后就会触及死机状态。

清晰明了的函数一定是有很棒的思路,很多时候我们由于需求的叙述,不由自主的就会被带偏,走进了需求方的思路,但是他们的思路实际上不是程序员的思路,没关系,多坑坑自然会找到好方法的。

JQ-wap-overlay

终于自己写了第一个插件了,晚上要喝一瓶饮料庆祝一下~

;(function($){
$.fn.extend({
“overlay_show”: function(){
var $_html = $.trim(this.html());
var $overlay = $(“<div class=’overlay’ style=’display: table;’></div>”);
var $overlay_bg = $(“<div class=’overlay-bg’></div>”);
$($_html).clone().appendTo($overlay_bg).css({“display”:”block”});
$overlay_bg.appendTo($overlay);
$overlay.appendTo($(“body”));
if($(“.overlay”).length>1){
return;
}
var $body_scroll_top = $(“body”)[0].scrollTop;
$(“body div:first”).css({
“position”:”fixed”,
“top”:-$body_scroll_top+”px”
});
},
“overlay_close”:function(){
this.closest(“.overlay-wrap-bg”).remove();
this.closest(“.overlay”).remove();
if($(“.overlay”).length>0){
return;
}
var $body_scroll_top = -parseInt($(“body div:first”).css(“top”));
$(“body div:first”).removeAttr(“style”);
$(window).scrollTop($body_scroll_top);
}
})
})(jQuery);

$(“body”).delegate(“[data-toggle=’overlay.show’]”, “click”,function(){
var $target = $($(this).attr(“data-target”));
$target.overlay_show();
return false;
});

$(“body”).delegate(“[data-toggle=’overlay.close’]”, “click”, function() {
var $btn = $(this);
$btn.overlay_close();
return false;
});

$(“body”).delegate(“.overlay-bg div”, “click”, function(e) {
e.stopPropagation();
});

$(“body”).delegate(“.overlay-bg”, “click”, function() {
var $div = $(this);
$div.overlay_close();
return false;
});

这个方法写出来已经很久了,但是一直不会写成插件,使用期间也是一直完善,智能教了让背景固定的方法,超赞。

这个方法在以后使用中肯定也会一直完善,没有完美的方法,只有最合适的方式。

demo