fly12358

fly12358的笔记

来自线性表(2)

数据结构:①按逻辑结构分类②按存储结构分类;①按逻辑结构分类:1.集合(无逻辑关系)2.线性结构(线性表)——【一维数组、 队列、 栈】;3.非线性结构——树、图、多维数组②按存储结构分类:1.顺序存储结构2.链式存储结构3.索引存储结构4.散列存储结构;——————————————————线性表:顺序表和链表;(按存储结构划分的;)顺序表:内存是按顺序排列下来;链表:内存中有节点,通过一个指针链接起来;            链表又分为:单链表(单向的 最后一个节点的指针域为空)循环链表(和循环链表相似,只是它的最后一个节点的指针域指向第一个头结点);双链表(数据的前后都有指针域,然后两边都链接起来,所以成为双链表);双链表能向前后两个方向移动,而单链表只能向一方移动;链表的操作:节点的删除(前边的跳过要删除的节点,就会删除该节点,删除的节点还需要释放;);;节点的插入(将指针域指向新加节点新加的节点指针域指向后边的指针域);   

来自千锋3G学院-C语言基础视频教程-第04讲-数组(2)(0)

数组完全初始化:a[3]={1,2,3}没有被初始化的变量元素为零;数组部分初始化:a[10]={1,2,3}; int a[5]; 其中a是数组,不能说a[5]是数组;可以说,a是int 5类型的数组;数组不能整体赋值;int a[5];a[0]=1,a[1]=2;//这样写对int b[5];b=a;//这样写是错的,数组不能整体赋值;a[4],内存中是这样存储的:a[0]占4位地址,a[1]占4位地址,a[2]占4位地址,a[3]占4位地址!!!当我们访问数组某个元素的时候,内存会自动找到相应的4位,如果要打印,会把首位地址打印出来;首位地址代表该元素的地址;

来自千锋3G学院-C语言基础视频教程-第05讲-指针(1)(0)

指针(pointer)是变量;int *p;p代表指针变量名;在64位系统下占8个字节;指针是用来装地址的;int a;int *p=&a;&是取地址符;把a的地址放到p里面;*p代表a; *代表地址的取值符;内存中的地址是以十六进制写的;这只是地址的编号,实际上要加地址偏移量;十六进制编号是为了方便阅读和编写;地址是常量,指针是变量;只有变量有地址; 常量不是空间,所以没有地址; 

来自千锋3G学院-C语言基础视频教程-第05讲-指针(2)(0)

指针通常和数组一起使用;//单独的数组名,如a相当于第一个元素的地址,即&a[0];数组名是数组的首元素地址。指针变量+1,其结果相当于加1个其指向的字节数;int *p=(int *)5;p++;最后p==9;//int类型占4个字节;char *q=(char *)5;q++;p==6;  int a[10]={};int *p = a;int i;for(i=0;i<10;i++){scanf("%d",a[i]);//这里的a[i]可以换成p+i;因为p+1的地址就是a[1]的地址...    换成p+i,只是把每个元素的地址取出来,如果要取元素,就要写成*(p+i);}return 0;每次都用*(p+i);取值!特别麻烦,这时人们就就发明了一个代替+i取* 的运算符;就是中括号运算符;*(p+3)=0;代表p[3]=0;*(p+n)==p[n]; 数组中也一样适用:a[3]=9;     相当于*[&(a[0])+3]=9;即*(p+3)=9; int main(){int a[4]={1,3,4,5};printf("%d",a[3]);printf("%d",3[a]);//两者相等;因为中括号运算符;//a[3]==*(a+3);//3[a]==*(3+a);}指针是地址变量;数组名是地址常量;它就代表着a[0]的地址,这也就解释了,数组为什么不能整体赋值;int main(){int a[10]={1,2,3,4,5};int *p=a;a[1]=2;*(a+1)=2;*(p+1)=2;p[1]=2;}上边四个式子都一样,因为 方括号运算符本身就是+i取*    

来自千锋3G学院-C语言基础视频教程-第05讲-指针(3)(0)

const关键字修饰指针变量;char a='A';const char *p=&a;char const *q=&a;1.*星前const:表示p可以改变,*p不可以改变,因为const修饰*p;char b='B';p=&b;这时可以编译,完全没问题,p可以改变,但是*p不可以改变;如果再把*p='C';这时会报错;read-only只读;但是b还是可以改变的;b = 'C'//这样是完全可以的;a='D'//这样也是完全可以的;2.*后const;char a = 'W';char b;char * const p=&a;*p='X';这样是可以的;p = &b;这样就不行了;const char * const q = &a;这样无论是*q还是q均不可改变;修饰哪个哪个不可改变;修饰*P那么*P不可改变;修饰p,那么p不可改变;

来自千锋3G学院-C语言基础视频教程-第06讲-函数(1)(0)

函数;将一些繁琐的,反复的,重复使用的代码,封装成一个函数,调用函数;

来自千锋3G学院-C语言基础视频教程-第06讲-函数(2)(0)

返回值;就是函数调用表达式的值;每个函数都可以调用其他函数;只用main可以调用其他,其他不能调用main;每个大括号都是一个单独的作用域;一个函数里面所有的成员变量,都会随着这个函数的消失而消失;//不能返回一个函数内的局部变量的地址;当内存开辟一个main函数空间时,我们称之为main函数的栈;当开辟一个其他函数的空间时,也就是其他函数的栈。其他函数栈中的变量会随着栈的消失而消失;参数写成void就是没有参数的函数;void func(int a)//a为形参;{printf("%d",a);}int main(){func(5);//5是实参;//传参就是用实参给形参赋值;} 

来自千锋3G学院-C语言基础视频教程-第06讲-函数(3)(0)

要修改一个变量,传参传变量的地址;分清值传递和址传递;传参如同赋值;

来自千锋3G学院-C语言基础视频教程-第06讲-函数(4)(0)

a[5]={1,2,3,4,5};数组名a就代表a[0]的地址;传参数时,如果看到数组名a,那就代表a[0]的地址;a[0]==*(a+0)==*a;a[i]==*(a+i);取*之后,是可以改变main函数的值的;只要加上const便不可修改值;

来自千锋3G学院-C语言基础视频教程-第07讲-复杂类型的确认(0)

复杂类型:由已知的拼凑出的类型;int *p[10];printf("%ld,%ld",sizeof(p),sizeof(int *p[10]));   //80  ,   80int *p[10]; //*和[]平级,又结合,从优先级上看,p离[]最近,所以说这是一个数组;它有10个元素,每个元素是指向整型变量的指针;int a,b,c;p[0]=&a;p[1]=&b;.......*p[0]=-1;p[0]就是指向a的指针,取*之后,就是a的值; int (*p)[10]printf("%ld,%ld\n",sizeof(p),sizeof(int (*)[10]));     //8  ,8这是一个指针;指针都是8字节;它指向10个整型元素的数组;int **p;二级指针;这是一个指针,它指向另一种指针,该指针指向整型;二级指针可以改变指针的指向;int *p(int);这是一个函数,它的参数是一个整型,返回值是一个指向整型的指针;int (*p)(int);这是一个指针,它指向参数是int返回值是int的函数;这种指针称之为:函数指针;int((*p[10])(int))(int);这是一个数组,10个元素;每个元素是某种指针,这种指针指向函数,该函数参数,参数一个int,返回值是另一种指针,该指针指向参数int 返回值int的函数;这样一个数组(应该有80个字节;)因为它有10个元素;每个元素是指针;    

来自千锋3G学院-C语言基础视频教程-第08讲-字符串(1)(0)

当我们写"hello"时,就是告诉编译器,在只读数据段存在6个字符;只读数据段:在内存中调一个函数时,会存在一个栈内,但是字符串是存在于一个离栈很远的只读数据段中,专门存储只读数据;它和栈是并列关系;"hello"表达式的值,表示字符串第一个字符的地址;write(i,j,k)这个函数:代表将j,打印到终端上,打印k个字节;"hello",在只读数据段中,存储了6个字节的6个字符地址为h的一个字符串;只读数据段的数据不可修改;有效字符:不包括/0的字符串;查看有效字符用 strlen()这个函数来计算,打印用 %ld 来打印;严格上来讲应该用%u来打!strlen遇到/0就结束计算了; 

来自iOS开发视频教程Objective-C【第一季】1.12 OC中点语法的使用(0)

1  点语法点语法 只能调用设置器和访问器;只能调用 set方法,或 get方法;设置属性值:person.age=22        ==        [person setAge:22];访问属性值:int age = person.age   ==   int age = [person age];注意的地方://test 方法在类中没有定义 调用时报错信息:unrecognzed selector sent to instance 0x10024534不能识别的选择器方法;

来自iOS开发视频教程Objective-C【第一季】1.13 课堂练习二(0)

两个类:Person  和  Dog;person:属性:名字 ,狗;方法:遛狗;Dog:属性:狗名,颜色;方法:跑,捡球,叫;(自定义初始化)人:9点:带狗出去跑,10点:和狗玩捡球游戏;11点:逗狗叫;(可以传入时间)===============Dog.h {    NSString * _name;    NSString * _color;}- (id)initWithName:(NSString *)newName WithColor:(NSString *)newColor;- (void)run;- (void)playBall;- (void)call;Dog.m- (id)initWithName:(NSString *)newName WithColor:(NSString *)newColor{    [super init];    if(self){    _name = newName;    _color = newColor;}    return self;}- (void)run{    NSLog(@"颜色为%@的%@在跑",_color,_name);}- (void)playBall{    NSLog(@"颜色为%@的%@在玩球",_color,_name);}- (void)call{    NSLog(@"颜色为%@的%@在叫",_color,_name);}Person.h#import "Dog.h"{    NSString * _name;    Dog * _dog;}- (void)setName:(NSString *)newName;- (void)setDog:(Dog *)newDog;- (void)playDog:(NSInteger)time;Person.m- (void)setName:(NSString *)newName{    _name = newName;}- (void)setDog:(Dog *)newDog;- (void)playDog:(NSInteger)time;- (void)setName:(NSString *)newName{    _name = newName;}- (void)setDog:(Dog *)newDog{    _dog = newDog;}- (void)playDog:(NSInteger)time{    if(time == 9){        [_dog run];    }else if(time == 10){        [_dog playBall];    }    else if(time == 10){        [_dog call]    }    else{    NSLog(@"休息中...");}}main.mDog * dog = [[Dog alloc]initWithName:@"小黑" WithColor:@"黑色"];Person * p1 = [[Person alloc]init];p1.newName = @"小张";p1.newDog = dog;int time;do{    NSLog@"请输入时间:";    scanf("%i",&time);    p1.teme=time;}while(time>=9&&time<=11);

来自iOS开发视频教程Objective-C【第一季】1.15#import与#include的区别(0)

#import 和 #include 的区别?两者其实都是拷贝到这里的意思;(功能一样,但是还是有区别的!)#include 调用两次会出现重复定义的错误;而#import则不会报错,他解决了重复导入的问题;#import 会有判断是否定义,如果定义,则不会再次导入;

来自iOS开发视频教程Objective-C【第一季】2.1 封装的概念(0)

OOP:面向对象编程;三大特征:封装 继承 多态;什么是封装?(把东西包起来,不让外部看见);将类的属性和方法封装起来,就是把类(属性、方法)藏起来!对功能的封装 就是对方法的封装(细节实现进行封装);对属性的封装;(对象同时具有属性和方法两特性,对象的属性 和 方法通常被封装在一起,共同体现实物的特性,二者相辅相成,不能分割)为什么要封装?不让客户了解那么多,不需要他关心这些东西,他只需要哪些功能就行;如果让他知道这些方法属性,他会觉得很麻烦,太多东西要了解;所以我们就为他封装起来;

来自iOS开发视频教程Objective-C【第一季】2.2 继承的概念(0)

继承:------(子类)(父类)什么是继承?A是B(is a)?如果能说通,那么则是继承关系;子类具有父类的一般特征(包括属性和行为),以及自身的特殊属性;

来自iOS开发视频教程Objective-C【第一季】2.10 权限修饰符的使用(0)

权限修饰符@private     类内部:YES  子类:NO  其他地方:NO@protected       YES        YES           NO@public          YES        YES           YES类中 默认是以 @protected 修饰的;OC中没有私有的方法;如果想使用私有的方法,则可以:父类里,不声明,只写实现,则表示这个方法在子类中调用的时候不能调用(表示该方法是私有的,【但是如果真想调用这个函数,还是可以调用的】)【其实私有方法,只是个约定而已,在语法上没有真正的私有语法】;

来自千锋3G学院-C语言基础视频教程-第08讲-字符串(2)(0)

atoi 函数;传参 字符的地址(字符串首字符地址)碰到一个不是数字的字符就停下来,如果遇到负数,能识别出第一个负号,不能识别后边的符号;strcmp 字符串比较函数 ;比较字符串:传入两个字符串,参数1比较大,返回正数;参数2比较大 返回负数;相等则返回0;strcmp(参数1,参数2);比较的方法:比较首字符的ascll码;如果相同,则比较第二个字符...... 

来自千锋3G学院-C语言基础视频教程-第08讲-字符串(3)(0)

需要引入头文件:#include<string.h>strcpy:(完成一个字符串的拷贝)传参传入两个字符串;将后边的参数,拷贝到前边的参数中;(前边参数的空间必须足够大,否则不能全部拷贝进去)char *p= "helloworld"; char buf[64]={}; strcpy(buf,p);printf("%s",buf);//打印出:helloworld未初始化的指针不能赋值;(未指向空间)strcat:(表示字符串的拼接);char buf[64] = "hello";char *p="world!";strcat(buf,p);printf("%s\n",buf);//buf的空间必须足够容纳拼接之后的字符串;字符串拼接时,前边那一段的\0会去掉,中间不会有尾0;//打印出 helloworldstrstr(在一个字符串中,查找另一个字符串)传入两个参数,在前边参数中,查找后边参数;查到该位置后,输出后边的字符串;如果查找中有两个想查字符串,查找到的是第一次出现的位置;如果没有要查字符串;则返回空,什么也不打印;char *p="welcome to qianfeng!";char *q="to";ret = strstr(p,q);printf("%s",ret);//打印出 to qianfeng!