CS50学习笔记

堆栈就是栈;
数组是进入堆内存的;
字符串是字符型数组,复制的时候传递的是数组第0个元素的地址;
整数INT四舍五入直接省略小数点后面的所有数,所以为了四舍五入,直接在变为INT之前加上0.5;
访问到操作系统的内存空间会直接停止程序或让系统崩溃;
先排序后查找效率更高,比如二分查找,排序是为了使用某些特定算法;

8:
断点能直接快速运行到你设置断点的地方;
硬件更新那么快以至于时间复杂度中的常熟都没有意义了;
递归有耗尽内存的风险,因为它会栈中不断增长,recursion=递归,递归会把原有的问题变成原有的更小的问题;

9:
归并排序利用递归思想O(n)=n*logn;

10:
变量储存的是一个键值对,键是内存地址,值就是存储的值;
$a = b 意 味 着 将 b意味着将 bb中的值赋值到 a 的 内 存 地 址 中 , 而 a的内存地址中,而 aa = & b 意 味 着 将 b意味着将 bb的内存地址和值都给 a ; u n s e t ( a; unset( aunset(a)后,内存中的键值对物理上还是存在的,只是PHP把它忘了,它就被垃圾回收了 ,所以变量记住的是键值对而不是单纯的值。KaTeX parse error: Expected 'EOF', got '&' at position 6: a代表值,&̲a代表键(内存地址);
null意味着返回地址是0,而地址0只应该被操作系统访问;
指针知识存储内存地址的变量,它的键值对是:键是php分配的内存地址,而值是它存储的内存地址;
malloc返回它开辟的内存空间的起始地址,new也是同样的过程;
int a说明a是一个指针变量,a的赋值只能是内存地址,int则是说a所存储的指针值所指向的数据类型必须是int;
a的赋值只能是int 类型的值,星号是说goto那个内存地址,a代表a所指的内存空间;
char
a声明后,用a代表指针变量,用*a代表指针所指的内存空间;
数组名本身就是一个指针变量;

#include <stdio.h>

int main(void) {
  int a[2] = {1,2};
  int *b = a;
  // int a = 1;
  printf("%X",&a);//&a是取出数组的地址,这里的&a是将a当做数组来看待而不是指针变量,数组的地址自然是首地址,所以它和a的值打印出来是一样的61FE48
   printf("%X",a);//这里的a是被当做指针变量来看待的,所以它的值是数组的起始地址61FE48
   printf("%X",&b);//将a的值赋值给一个指针变量,然后打印这个变量的键值对61FE40
   printf("%X",b);//证明b和&b的值是不同的,证明指针变量也是由键值对组成的,虽然值的类型是内存地址,61FE48
   //但是本身也需要内存地址来存储。也就是说a也是这样的一个键值对,只是当a是数组时,我还没有找到方法打印出指针变量a的内存地址
  return 0;

#include <stdio.h>

int main(void) {
  int a = 1;
  int *b = &a;
  printf("%x\n",b);//61fe4c
  printf("%x\n",&a);//61fe4c
  printf("%x\n",&b);//61fe40,说明指针本身也需要内存地址来存储。
  printf("%x\n",*b);//*b是变量a的别名,输出1,所以*b也叫作间接访问符
  return 0;
}
}

11:
内存中的高地址在下,而低地址在上。栈是由高地址向低地址发展的。
在这里插入图片描述
缓冲区溢出,是指你给一个变量的数据量超过了它的存储范围,如果数据量过大,那么多余的数据可能直接影响到操作系统的内存地址,这样会造成系统或者程序崩溃。如果不是很大的数据量,但是也超过了范围也会很可怕,因为黑客可以利用函数的特性重新覆盖函数结束后的返回地址,而这些返回地址则是自己写的代码的起始地址。

12:
电脑在硬盘上存储完文件后,你的系统其实有一张像EXCEL表的东西,一张两列的表,左边的表头是文件名,右边的表头是地址。当你删除一个文件的时候,其实是删除这个表中的数据,而文件其实还存在在你的电脑上。我在想变量的声明是不是也是这样,有一张表,左边是变量名,右边是变量的内存地址。所以如果硬盘不用了最好扔掉也不要给别人,否则硬盘上的数据可能会被必有用心的人恢复。MAC使用安全删除功能的话,会将物理硬盘的上的比特全部转换成1或者0,所以MAC更安全一些。

RGB:三原色,红绿蓝;

结构体也是一种变量。

14:
struct结构代表构成某种新的数据结构;
hash表示数组和链表的结合;
在这里插入图片描述

15:
HTML不是一门编程语言,而是一门标记语言,它不能告诉电脑去做什么事情,而是告诉电脑怎么显示这些东西;
HTTP是一个把客户端和服务端联系在一起的协议,让你的客户端能够从服务端上取得页面;

17:
get的方式提交表单是将参数放在URL后面的,这样提交的好处是生成这样一个URL的状态,从而你可以收藏它,或者复制它进入别的链接,让别人也看到你所看到的状态;

18:
PHP中的关联数组就是一张哈希表;
JS所需要动态显示的数据都已经提前下载好了,而不是事件触发以后再下载,当然也有需要重新下载的,比如地图;
print_r是递归打印的意思,r for recursion;
JS作为一门编程语言可以在客户端直接做某些事情,比如字段的合法性验证,而不需要把数据传回服务器来让PHP做。这样用户体验更好,不过还是需要在服务器端做验证的,因为JS在客户端是可以关闭的;
this是一个指向自己的变量;
JS有一个对象xmlhttprequest来发起http请求,就像html中的a标签和form标签中的action一样,这是异步请求的基础;

19:
web是互联网的一个服务,而互联网是支持该服务的物理设施;
路由器维护着一个IP地址对应端口的表,而交换机维护着一张MAC地址对应的端口表;
C中的结构体和PHP中的类与JS中的对象是非常相似的,JS的对象也是一张哈希表;
函数后面不加括号意思是,先不要调用这个函数,而是传入函数名或者函数指针,这样就可以把函数赋值给变量或者作为参数传入别的函数。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值