当前位置: 首页 > news >正文

用php做网站用什么框架杭州软件开发培训机构

用php做网站用什么框架,杭州软件开发培训机构,简述一个网站开发流程,自己做的网站怎么让别人看到1为什么使用指针 假如我们定义了 char a’A’ #xff0c;当需要使用 ‘A’ 时#xff0c;除了直接调用变量 a #xff0c;还可以定义 char *pa #xff0c;调用 a 的地址#xff0c;即指向 a 的指针 p #xff0c;变量 a#xff08; char 类型#xff09;只占了一…1为什么使用指针 假如我们定义了 char a’A’ 当需要使用 ‘A’ 时除了直接调用变量 a 还可以定义 char *pa 调用 a 的地址即指向 a 的指针 p 变量 a char 类型只占了一个字节,指针本身的大小由可寻址的字长来决定指针 p 占用 4 个字节。但如果要引用的是占用内存空间比较大东西用指针也还是 4 个字节即可。使用指针型变量在很多时候占用更小的内存空间。变量为了表示数据指针可以更好的传递数据举个例子第一节课是 1 班语文 2 班数学第二节课颠倒过来 1 班要上数学 2 班要上语文那么第一节课下课后需要怎样作调整呢方案一课间 1 班学生全都去 2 班 2 班学生全都来 1 班当然走的时候要携带上书本、笔纸、零食……场面一片狼藉方案二两位老师课间互换教室。显然方案二更好一些方案二类似使用指针传递地址方案一将内存中的内容重新“复制”了一份效率比较低。在数据传递时如果数据块较大可以使用指针传递地址而不是实际数据即提高传输速度又节省大量内存。一个数据缓冲区 char buf[100] 如果其中 buf[0,3] 为命令号, buf[4,5] 为类型, buf[6~10] 为该类型的数值类型为 int 使用如下语句进行赋值*(short*)buf[0]DataId; *(short*)buf[4]DataType; *(int*)buf[6]DataValue; 数据转换利用指针的灵活的类型转换可以用来做数据类型转换比较常用于通讯缓冲区的填充。指针的机制比较简单其功能可以被集中重新实现成更抽象化的引用数据形别函数指针形如: #define PMYFUN (void*)(int,int) 可以用在大量分支处理的实例当中如某通讯根据不同的命令号执行不同类型的命令则可以建立一个函数指针数组进行散转。在数据结构中链表、树、图等大量的应用都离不开指针。2 指针是什么 操作系统将硬件和软件结合起来给程序员提供的一种对内存使用的抽象这种抽象机制使得程序使用的是虚拟存储器,而不是直接操作和使用真实存在的物理存储器。所有的虚拟地址形成的集合就是虚拟地址空间。内存是一个很大的线性的字节数组每个字节固定由 8 个二进制位组成每个字节都有唯一的编号如下图这是一个 4G 的内存他一共有 4x1024x1024x1024 4294967296 个字节那么它的地址范围就是 0 ~ 4294967296 十六进制表示就是 0x000000000xffffffff 当程序使用的数据载入内存时都有自己唯一的一个编号这个编号就是这个数据的地址。指针就是这样形成的。#include stdio.hint main(void) {char ch a;int num 97;printf(ch 的地址:%pn,ch); //ch 的地址:00BEFDF7printf(num的地址:%pn,num); //num的地址:00BEFDF8return 0; } 指针不仅可以表示变量的地址还可以存储各种类型数据的地址指针变量是用来保存这些地址的变量与数组类似依据地址存放的数据类型指针也分为 int 指针类型 double 指针类型 char 指针类型等等。综上指针的实质就是数据在内存中的地址而指针变量是用来保存这些地址的变量。指针变量 和 指向关系 用来保存 指针 的变量就是指针变量。如果指针变量p保存了变量 num的地址则就说p指向了变量num也可以说p指向了num所在的内存块指针变量pp指向了p所在的内存块以下面为例#include stdio.hint main(void) {int num 97;char ch a;int *p num;int **pp p;char *p1 ch;printf(num 的地址:%pn,num); printf(指针p的值:%pn,p); printf(指针p的地址:%pn,p); printf(指针pp的值:%pn,pp); printf(ch 的地址:%pn,ch); return 0; } int型的num值为97占4个字节内存地址为:0113F924char 型的ch(a)值为97占1个字节内存地址为:0113F91B。num的地址为0113F924num的值为 97 指针 p 指向 num 的内存块指针 p 地址为0113F90Cp的内存保存的值就是num的地址0113F924。指针变量 pp 指向 指针 p指针 pp 内存值为 指针 p 的地址0113F90C形成了只想指针的指针。定义指针变量C语言中定义变量时在变量名 前 写一个 * 星号这个变量就变成了对应变量类型的指针变量。必要时要加( ) 来避免优先级的问题。引申C语言中定义变量时在定义的最前面写上typedef 那么这个变量名就成了一种类型即这个类型的同义词。int a ; //int类型变量 a int *a ; //int* 变量a int arr[3]; //arr是包含3个int元素的数组 int (* arr )[3]; //arr是一个指向包含3个int元素的数组的指针变量int* p_int; //指向int类型变量的指针 double* p_double; //指向idouble类型变量的指针 struct Student *p_struct; //结构体类型的指针 int(*p_func)(int,int); //指向返回类型为int有2个int形参的函数的指针 int(*p_arr)[3]; //指向含有3个int元素的数组的指针 int** p_pointer; //指向 一个整形变量指针的指针 取地址既然有了指针变量那就得让他保存其它变量的地址使用 运算符取得一个变量的地址。int add(int a , int b) {return a b; }int main(void) {int num 97;float score 10.00F;int arr[3] {1,2,3};int* p_num num;float* p_score score;int (*p_arr)[3] arr; int (*fp_add)(int ,int ) add; //p_add是指向函数add的函数指针return 0; } 特殊的情况他们并不一定需要使用取地址数组名的值就是这个数组的第一个元素的地址。函数名的值就是这个函数的地址。字符串字面值常量作为右值时就是这个字符串对应的字符数组的名称,也就是这个字符串在内存中的地址。int add(int a , int b){return a b; } int main(void) {int arr[3] {1,2,3};int* p_first arr;int (*fp_add)(int ,int ) add;const char* msg Hello world;return 0; } 解地址对一个指针解地址就可以取到这个内存数据解地址 的写法就是在指针的前面加一个 * 号。解指针的实质是从指针指向的内存块中取出这个内存数据。int main(void) {int age 19;int*p_age age;*p_age 20; //通过指针修改指向的内存数据printf(age %d,*p_age); //通过指针读取指向的内存数据printf(age %d,age);return 0; } 空指针空指针在概念上不同于未初始化的指针。空指针可以确保不指向任何对象或函数而未初始化的指针则可能指向任何地方。空指针不是野指针。在C语言中我们让指针变量赋值为NULL表示一个空指针而C语言中NULL实质是 ((void*)0) 在C中NULL实质是0。#ifdef __cplusplus#define NULL 0 #else #define NULL ((void *)0) #endif void*类型指针void是一种特殊的指针类型可以用来存放任意对象的地址。一个void指针存放着一个地址这一点和其他指针类似。不同的是我们对它到底储存的是什么对象的地址并不了解。double a2.3; int b5; void *pa; coutpendl; //输出了a的地址pb; coutpendl; //输出了b的地址//cout*pendl;这一行不可以执行void*指针只可以储存变量地址不可以直接操作它指向的对象 由于void是空类型只保存了指针的值而丢失了类型信息我们不知道他指向的数据是什么类型的只指定这个数据在内存中的起始地址如果想要完整的提取指向的数据程序员就必须对这个指针做出正确的类型转换然后再解指针。数组和指针 同类型指针变量可以相互赋值数组不行只能一个一个元素的赋值或拷贝数组在内存中是连续存放的开辟一块连续的内存空间。数组是根据数组的下进行访问的。指针很灵活它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。数组所占存储空间的内存sizeof数组名 数组的大小sizeof数组名/sizeof数据类型在32位平台下无论指针的类型是什么sizeof指针名都是 4 在 64 位平台下无论指针的类型是什么sizeof指针名都是 8 。数组名作为右值的时候就是第一个元素的地址int main(void) {int arr[5] {1,2,3,4,5};int *p_first arr;printf(%d,*p_first); //1return 0; } 指向数组元素的指针 支持 递增 递减 运算。p p1意思是让p指向原来指向的内存块的下一个相邻的相同类型的内存块。在数组中相邻内存就是相邻下标元素。函数与指针 函数的参数和指针C语言中实参传递给形参是按值传递的也就是说函数中的形参是实参的拷贝份形参和实参只是在值上面一样而不是同一个内存数据对象。这就意味着这种数据传递是单向的即从调用者传递给被调函数而被调函数无法修改传递的参数达到回传的效果。void change(int a) {a; //在函数中改变的只是这个函数的局部变量a而随着函数执行结束a被销毁。age还是原来的age纹丝不动。 } int main(void) {int age 60;change(age);printf(age %d,age); // age 60return 0; } 有时候我们可以使用函数的返回值来回传数据在简单的情况下是可以的但是如果返回值有其它用途例如返回函数的执行状态量或者要回传的数据不止一个返回值就解决不了了。传递变量的指针可以轻松解决上述问题。void change(int* pa) {(*pa); //因为传递的是age的地址因此pa指向内存数据age。当在函数中对指针pa解地址时//会直接去内存中找到age这个数据然后把它增1。 } int main(void) {int age 160;change(age);printf(age %d,age); // age 61return 0; } 比如指针的一个常见的使用例子#include stdio.h #include stdlib.h #include string.hvoid swap(int *,int *); int main() {int a5,b10;printf(a%d,b%dn,a,b);swap(a,b);printf(a%d,b%dn,a,b);return 0; } void swap(int *pa,int *pb) {int t*pa;*pa*pb;*pbt; } 在以上的例子中swap函数的两个形参pa和pb可以接收两个整型变量的地址并通过间接访问的方式修改了它指向变量的值。在main函数中调用swap时提供的实参分别为a,b这样就实现了paa,pbb的赋值过程这样在swap函数中就通过*pa修改了 a 的值通过*pb修改了 b 的值。因此如果需要在被调函数中修改主调函数中变量的值就需要经过以下几个步骤定义函数的形参必须为指针类型以接收主调函数中传来的变量的地址调用函数时实参为变量的地址在被调函数中使用*间接访问形参指向的内存空间实现修改主调函数中变量值的功能。指针作为函数的形参的另一个典型应用是当函数有多个返回值的情形。比如需要在一个函数中统计一个数组的最大值、最小值和平均值。当然你可以编写三个函数分别完成统计三个值的功能。但比较啰嗦如int GetMax(int a[],int n) {int maxa[0],i;for(i1;in;i){if(maxa[i]) maxa[i];}return max; } int GetMin(int a[],int n) {int mina[0],i;for(i1;in;i){if(mina[i]) mina[i];}return min; } double GetAvg(int a[],int n) {double avg0;int i;for(i0;in;i){avga[i];}return avg/n; } 其实我们完全可以在一个函数中完成这个功能由于函数只能有一个返回值可以返回平均值最大值和最小值可以通过指针类型的形参来进行实现double Stat(int a[],int n,int *pmax,int *pmin) {double avga[0];int i;*pmax*pmina[0];for(i1;in;i){avga[i];if(*pmaxa[i]) *pmaxa[i];if(*pmina[i]) *pmina[i];}return avg/n; } 函数的指针一个函数总是占用一段连续的内存区域函数名在表达式中有时也会被转换为该函数所在内存区域的首地址。我们可以把函数的这个首地址赋予一个指针变量使指针变量指向函数所在的内存区域然后通过指针变量就可以找到并调用该函数。这种指针就是函数指针。函数指针的定义形式为returnType (*pointerName)(param list);returnType 为函数返回值类型pointerNmae 为指针名称param list 为函数参数列表。参数列表中可以同时给出参数的类型和名称也可以只给出参数的类型省略参数的名称这一点和函数原型非常类似。用指针来实现对函数的调用#include stdio.h //返回两个数中较大的一个 int max(int a, int b) {return ab ? a : b; } int main() {int x, y, maxval;//定义函数指针int (*pmax)(int, int) max; //也可以写作int (*pmax)(int a, int b)printf(Input two numbers:);scanf(%d %d, x, y);maxval (*pmax)(x, y);printf(Max value: %dn, maxval);return 0; } 结构体和指针 结构体指针有特殊的语法 - 符号如果p是一个结构体指针则可以使用 p -【成员】 的方法访问结构体的成员typedef struct {char name[31];int age;float score; }Student;int main(void) {Student stu {Bob , 19, 98.0};Student*ps stu;ps-age 20;ps-score 99.0;printf(name:%s age:%d ,ps-name,ps-age);return 0; } const 和 指针 指向常量的指针值不能改变指向可改变常指针值能改变指向不可改变指向常量的常指针都不能改变#include stdio.hint main() {// 1 可改变指针const int a 10;int *p a;*p 1000;printf(*p %dn, *p);// 2 可改变指针const b 10;int *pb b;pb p;printf(*pb %dn, *pb);// 3const c 10;int * const pc c;*pc 1000;//pc pb;不能改变//4const d 10;const * int const pd d;//*pd 1000; 不能改变printf(n);return 0; } 深拷贝和浅拷贝 如果2个程序单元例如2个函数是通过拷贝 他们所共享的数据的 指针来工作的这就是浅拷贝因为真正要访问的数据并没有被拷贝。如果被访问的数据被拷贝了在每个单元中都有自己的一份对目标数据的操作相互 不受影响则叫做深拷贝。#include iostream using namespace std;class CopyDemo { public:CopyDemo(int pa,char *cstr) //构造函数两个参数{this-a pa;this-str new char[1024]; //指针数组动态的用new在堆上分配存储空间strcpy(this-str,cstr); //拷贝过来}//没写C会自动帮忙写一个复制构造函数浅拷贝只复制指针,如下注释部分//CopyDemo(CopyDemo obj) //{// this-a obj.a;// this-str obj.str; //这里是浅复制会出问题要深复制//}CopyDemo(CopyDemo obj) //一般数据成员有指针要自己写复制构造函数如下{this-a obj.a;// this-str obj.str; //这里是浅复制会出问题要深复制this-str new char[1024];//应该这样写if(str ! 0)strcpy(this-str,obj.str); //如果成功把内容复制过来}~CopyDemo() //析构函数{delete str;}public:int a; //定义一个整型的数据成员char *str; //字符串指针 };int main() {CopyDemo A(100,hello!!!);CopyDemo B A; //复制构造函数把A的10和hello!!!复制给Bcout A: A.a , A.str endl;//输出A:100hello!!!cout B: B.a , B.str endl;//输出B:100hello!!!//修改后,发现A,B都被改变原因就是浅复制A,B指针指向同一地方修改后都改变B.a 80;B.str[0] k;cout A: A.a , A.str endl;//输出A:100kello!!!cout B: B.a , B.str endl;//输出B:80kello!!!return 0; } 根据上面实例可以看到浅复制仅复制对象本身其中包括是指针的成员这样不同被复制对象的成员中的对应非空指针会指向同一对象被成员指针引用的对象成为共享的无法直接通过指针成员安全地删除因为若直接删除另外对象中的指针就会无效形成所谓的野指针而访问无效指针是危险的除非这些指针有引用计数或者其它手段确保被指对象的所有权而深复制在浅复制的基础上连同指针指向的对象也一起复制代价比较高但是相对容易管理。
http://wiki.neutronadmin.com/news/287037/

相关文章:

  • 微网站手机制作时事新闻热点
  • 设计师找图网站怎么让网站能被百度到
  • 做网站的是外包公司吗南京h5 网站建设
  • 沧州网站建设 益志科技打开百度一下的网址
  • 遂川网站建设网站建设 题目
  • 嘉兴做网站多少钱建设微信网站制作
  • 温县住房与城乡建设局网站企业网站php开源系统
  • 网站怎么做留言长沙网站制作有哪些公司
  • 电子商务网站开发 pdf廊坊百度推广电话
  • 建立网站的优势wordpress图片美化
  • 做计算机题的网站营销型网站建设申请域名
  • 昆山教育云平台网站建设一级a行做爰片免费网站
  • 网站无搜索结果页面怎么做asp.net 网站建设
  • 饿了么网站做生鲜吗如何建立公司网站账号
  • 网络设计方案的组成部分网站运营seo
  • 做调查问卷网挣钱的网站ps怎么设计网页
  • 专业做营销网站建设网站与客户互动
  • 淘宝网站建设可以申请赔款邦邻网站建设熊掌号
  • 做网站出路铜川网站建设电话
  • 惠州惠城区建设网站wordpress 数据库错误
  • 网站建设类公soho网站建设教程
  • 企业建站模板重庆建设网站
  • 赛门博网站建设做网站兴趣爱好
  • 网站建设与维护 课件c 网站购物车怎么做
  • 章丘做网站公司微信oa系统
  • 网站上的按钮怎么做微信扫一扫登录网站如何做
  • asp网站制作免费模板下载影楼模板网站
  • 做网站还是做游戏大连招聘网最新招聘
  • 新闻聚合网站开发那个网站可教做课件好
  • 网站建设与信息安全培训小结网站视频主持人怎么做