barriers / 阅读 / 详情

数据结构是什么

2023-07-28 09:10:23
共1条回复
snjk

数据结构是计算机存储、组织数据的方式。

数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

数据的逻辑结构和储存结构是数据结构的两个密切相关的方面,同一逻辑结构可以对应不同的存储结构。算法的设计取决于数据的逻辑结构,而算法的实现依赖于指定的存储结构。

数据结构的研究内容是构造复杂软件系统的基础,它的核心技术是分解与抽象。通过分解可以划分出数据的3个层次;再通过抽象,舍弃数据元素的具体内容,就得到逻辑结构。类似地,通过分解将处理要求划分成各种功能,再通过抽象舍弃实现细节,就得到运算的定义。

数据的物理结构介绍:

数据的物理结构是数据结构在计算机中的表示(又称映像),它包括数据元素的机内表示和关系的机内表示。由于具体实现的方法有顺序、链接、索引、散列等多种,所以,一种数据结构可表示成一种或多种存储结构。

数据元素的机内表示(映像方法):用二进制位(bit)的位串表示数据元素。通常称这种位串为节点(node)。当数据元素有若干个数据项组成时,位串中与各个数据项对应的子位串称为数据域(datafield)。因此,节点是数据元素的机内表示(或机内映像)。

顺序存储结构和链式存储结构。顺序映像借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。非顺序映像借助指示元素存储位置的指针(pointer)来表示数据元素之间的逻辑关系。

以上内容参考:百度百科-数据结构

相关推荐

pointer;是什么意思

pointer英 [u02c8pu0254u026antu0259(r)] 美 [u02c8pu0254u026antu025a] n. 教鞭;建议;线索;(测量仪器上的)指针
2023-07-26 16:37:462

C语言指针问题,我这样想利用pointpointer改变pointer,使pointer指向整形变量number2,可是最终运行不对

*pointpointer = &number2;这样就对了
2023-07-26 16:37:541

指针(pointer)有什麼用???

指针=内存门牌号找变量只要找对门牌号就找到了
2023-07-26 16:38:013

C++请高手帮忙注释或讲解其中s t lastpointer pointer 这几个参数的意义和作用

这段代码的主要功能就是使用队列来格式化输出二叉树,队列的特点就是先进先出,因此该方法的基本思想史,首先把树的根结点放入队列,判断队列是否为空,如果不为空,输出队列头结点的值,判断该结点是否有左右结点,如果有,把它们送入队列中,然后使队列头结点出队;如果为空,表示树中所有结点的值已全部输出。s:指出该结点在书中的深度,根结点深度为1,下一层结点为2,以此类推,程序里面h也是用来记录上一个从队列中出来的结点的深度t:举个例子来说,对于深度为3满二叉树,最底层的叶子结点的数目是4个,则从左往右编号1-2-3-4,t就是这些编号,如果该结点是左结点,该t值等于其父亲结点的t值乘上2再减去1,如果是右结点,则只是父亲结点的t值乘上2,这就是代码后面输出oper后为什么这样给t赋值。lastpointer :该指针指向上一个从队列aQueue中出来的头结点pointer :该指针指向队列aQueue中的头结点中间if...else if..else中的意思就是在输出oper之前,在oper的值前面要输出多少个空格,使结果呈现树的那种形态
2023-07-26 16:38:231

int *pointer;那么 (pointer)++与pointer++有什么区别?

(pointer)++与pointer++基本没差别1、&*pointer 由右向左结合,取pointer指针的值,再取这个值的地址,相当于取a的地址2、*&a 由右向左结合,取a的地址,再取这个地址的值,相当于取a的值纯粹文字游戏,无必要不要这样写程序
2023-07-26 16:38:301

c++ pointer 与指针有关的问题

因为这个你返回的指针所指向的内容 在函数调用完毕时就是一个不确定的值了,因为数组时局部的,函数调用完毕的时候会自动销毁的,虽然有个地址,但是地址所指向的内容是不对的,好好想想 ,呵呵,希望我的回答能够帮到你。
2023-07-26 16:38:393

C++的pointer问题?

第一个是指针,接收指针类型的实参,第二个是引用,接收整型实参
2023-07-26 16:38:473

C语言中两个指针变量(pointer_1)++和pointer_1++的区别?

++应该和*(作为指针取值时)优先级相同吧,只是这一级运算符按照 自右向左 结合规则,导致++比*优先处理。有点儿吹毛求疵,但感觉这样好像更严谨一些。
2023-07-26 16:38:575

c语言 pointer 完全一团浆糊…

int *p=&x;p是地址,而*p可以来理解为解引用,就是值。对于char* p的那个,其实是编译器搞的鬼!*p为首字母,而输出p的时候,编译器会自动寻址到‘"处!char p[]:数组么!存的类型为char,单个字符char* p[]:指针数组!存的类型为char*,可以为字符串同一时间答题,为什么他最快回答?无奈没抢到最快,就再说一些有用没用的废话吧!如果你只是问C而不是C++那么你不会涉及到string,string是一个泛型类(stl其中之一),string的处理方式并没有尾部追加‘"。追加""是C语言的。至于char* p,p其实就是地址。上面说了编译器搞的鬼。因为你输出用的是“%s”。对于寻址:int *p,他拿到的就是个int,4字节。无可厚非。所以int* p指向int类型的变量。而char* p寻址也如其表示一样。就是按照char类型寻址,1字节,但是他最终会寻址到""处,来告诉编译器,你不能向下寻址了!
2023-07-26 16:39:162

一 :c语言中*pointer()和(*pinter)()有区别吗? 请详细说明。

肯定有的
2023-07-26 16:39:363

c语言,关于pointer的问题,求解,THX

char *c,*d; c = s;//指向s的首元素地址 d = &s[3];//指向s[3]的地址
2023-07-26 16:39:446

变量都可以简写吗,如:pointer简写为:“p”

变量是自己定义的,想怎么写就怎么写
2023-07-26 16:39:584

关于c语言pointer的一个问题 ++30

#include<iostream.h>int point_Sum(int *arrayName,int arraylength);main(){ int result = 0; int array[5] = {1,3,5,7,9}; result = point_Sum(array,5); printf("数组array的所有元素的和 是:%d ",result);}int point_Sum(int* arrayName, int arraylength){ int * ptrArray = arrayName; int sum = 0; for(i=0;i<arraylength;i++){ sum += *ptrArray ; ptrArray ++; } return sum; }
2023-07-26 16:40:062

(在线等)请问C语言中* pointer_i与* i_pointer有什么区别

你好!int*pointer=3;合法?我都编译不能通过!!!如有疑问,请追问。
2023-07-26 16:40:163

1.定义2个浮点型变量 2.定义2个指针变量a_pointer,b_pointer,使这2个指针变量分别指向a,b 3.用printf函数输

.....
2023-07-26 16:40:264

C语言,指针的指向*pointer_1=a;是否等价于pointer_1=&a;

这样写:int *p1 = NULL;int *p2 = NULL;int *p3 = NULL;初始化下指针。
2023-07-26 16:40:372

C语言指针问题。

点头像,,
2023-07-26 16:40:577

c++ pointer问题

*号是解引用符号。*p 表示获得 p指针指向的对象的引用例如p=&firstvalue的话,你把 *p当成就是firstvalue 就能明白拉!而至于p2 = &secondvalue;p1=p2;可以当作就是p1=&secondvalue;
2023-07-26 16:41:122

c++里面 pointer+k 和 *(pointer+k)的区别是什麼呀

设 p 是指针,则 p+k 表示指针向后移动 k 个单元,每个单元的大小是 p 指向的类型的 sizeof 大小,所以 p+k 的结果仍然是个指针。而 *(p+k) 是得到 p+k 这个指针位置上存储的数据类型的值。
2023-07-26 16:41:202

c++pointer和*p一样吗

一样
2023-07-26 16:41:502

pointerpointer有多少个图片

有大量的图片,因为这里面的图片是会动态更新增加的。
2023-07-26 16:41:571

如何实现pointer类型的数据写到数组中

可以,是引用private void myfunc(List<Point> yourlist){yourlist.Add(new Point(123, 456));}private void button1_Click(object sender, EventArgs e){List<Point> mylist = new List<Point>();myfunc(mylist);Text = mylist[0].ToString(); // 123, 456}
2023-07-26 16:42:041

为什么pointer-1和pointer-2的地址没有互换啊

你没有理解C语言函数“值传递”的含义,形参不会影响实参,要想通过函数改变变量的值,要传递该变量的地址给函数,现在你要通过swap函数改变指针的值,那就要把该指针的地址传递给函数,要把pointer-1和pointer-2 的地址传递给swap才行,那么swap的参数类型是int**才行如下:void swap(int** p1,int** p2){int* temp;temp=*p1;*p1=*p2;*p2=temp;}调用时用pointer-1和pointer-2的地址:swap(&pointer-1,&pointer-2); 开头的函数声明也要改一下
2023-07-26 16:42:121

Delphi程序使用资源的释放

 写出一个不会造成资源分配崩溃的Delphi应用程序的关键是确保如果程序中分配了资源 即使当故障发生 程序也应能释放占用的资源   文件 内存 WINDOWS资源和对象是一些必须时时加以注意的需确保释放的资源 下面的事件控制代码例子中先分配了内存 然后产生了一个错误 而造成它不再执行释放内存的程序代码   ProcedureTForm .ButtonlClick(Sender Tobject)   Var   Pointer Pointer   Integer Numzero Intger   begin   Numzero Κ   GetMem(Pointer ) {分配 K的内存资源}   Integer Κ divNumzero {此句产生一个除法错误}   FreeMem(Pointer ) {这里此句将不被执行}   end   尽管大多数错误不会这样明显 但上例包含了重要的一点 当错误产生后 程序执行跳出模块 其后的资源释放程序代码不再被执行 为了确保上例中的FreeMem能够释放被GetMem占用的内存资源 必须把代码放入一个资源保护模块   这里给出一个曲型的资源保护模块的格式   {资源的分配}   try   {资源的使用}   finally   {资源的释放}   end   上面的try...finally模块可以使程序总能执行finally部分中的任何程序代码 即使有错误在保护模块中产生 当try部分中的某一条代码执行引起错误时 执行将直接跳到finally部分 若执行中没有错误产生 则程序按正常顺序执行   在下面的事件控制代码例子中先分配了内存 然后产生了一个错误 但是仍然执行了释放内存的程序代码   ProcedureTForm .Button Click(Sender Tobject)   Var   Pointer Pointer   Integer Numzero Integer   begin   Numzero Κ   GetMem(Pointer ) {分配 K的内存资源}   try   Integer Κ divNumzero {此句产生一个除法错误}   finally   FreeMem(Pointer ) {这里此句仍将被执行}   end   end lishixinzhi/Article/program/Delphi/201311/25084
2023-07-26 16:42:191

怎么访问Pointer类型的变量?

我定义了如下一个变量:a:Pointer;FileWrite(filename,a,...);如何读取a中的内容?
2023-07-26 16:42:281

java调用dll如何传入指针?invoke后如何获取指针的值?

假设我有一个叫test.dll的动态库,其中有一个函数如下:  extern "C" int add(int* a,int* b,int* c,int d,char* PicPath)  {  FILE *fp;  fp=fopen(PicPath,"wt");  for(int i=0;i   {  c[i]=a[i]+b[i];  fprintf(fp,"%d ",c[i]);  }  fclose(fp);  return 1;  }  该函数的功能是a,b两个数组的值相加,和存放的数组c中,在将和写入到指定的文件,数组的维数  有传入的参数决定。  问题提出:  1.Java中如何调用指针类型的参数;  2.整形的参数可以直接传入吗?;  3.PicPath为何是指针型的,怎么不是CString类型的;  4.如何获取输入型参数的返回值;  Java调用动态链接库的代码如下:  JNative t= new JNative("test.dll", "add"); //加载test.dll文件,并调用add方法;  t.setRetVal(Type.INT); // 设置调用后的返回类型  // Java中构造指针,并为指针分配空间  Pointer a = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));  Pointer b = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));  Pointer c = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));  Pointer strP= createPointer(100);  strP.setStringAt(0, "C:\1.txt");  int d=10;  // 为数组a和b赋值  for (int i = 0; i   a.setIntAt(4 * i, i);  b.setIntAt(4 * i, i);  }  // 设置参数:  t.setParameter(0, a);  t.setParameter(1, b);  t.setParameter(2, c);  t.setParameter(3, d);  t.setParameter(4, strP);  t.invoke(); // 调用函数并执行  // 输出和的值,注意:一个整形值需要用4个字节存储,所以j前面需要乘以4  for (int j = 0; j   System.out.println(c.getAsInt(4 * j));  }  // 释放内存  a.dispose();  b.dispose();  c.dispose();  好了,这样一个完整的调用例子就结束了,我只是写出了程序中的关键的代码,具体的还需要写一  个类,并且继承一个基类,在复写基类中的方法,这些都比较简单,大家可以参考一下网上的其他  例子。  问题解答:  1.Java中调用指针类型的参数:需要创建Pointer变量,并为其分配空间  2.整形的数据可以直接传入;  3.JNative对CString类型支持不是很良好,调用CString的方法时,经常会报一些异常,所以我把路径改成  的字符指针;  4.输入型参数作为输出:可以参见以上的例子,数组c是如何设置和输出的。
2023-07-26 16:42:481

Epson投影仪的pointer(电子教鞭功能)是什么用的?怎么使用梯形矫正?在遥控上是哪个键?

梯形矫正:menu菜单,进入高级模式,上下找,有梯形矫正
2023-07-26 16:42:571

reference和pointer的区别和联系

下面是我写的一段程序来验证pointer与reference的区别和联系的,希望能对大家理解pointer & reference的区别和联系有所帮助:#include "stdafx.h"#include <iostream>using namespace std;int main(int argc, char* argv[]){ int ival = 1024; int *pi = &ival; // a pointer int &rval = ival; // a reference int jval = 4096; int xval = 8192;cout << "ival = " << ival << " "; cout << "&ival = " << &ival << " "; cout << endl; cout << "pi = " << pi << " "; cout << "&pi = " << &pi << " "; cout << "*pi = " << *pi << " "; cout << endl; cout << "rval = " << rval << " "; cout << "&rval = " << &rval << " "; cout << endl; cout << "jval = " << jval << " "; cout << "&jval = " << &jval << " "; cout << endl;// change the values of the reference and the pointer pi = &jval; rval = jval;// print the changes cout << endl; cout << "ival = " << ival << " "; cout << "&ival = " << &ival << " "; cout << endl; cout << "pi = " << pi << " "; cout << "&pi = " << &pi << " "; cout << "*pi = " << *pi << " "; cout << endl; cout << "rval = " << rval << " "; cout << "&rval = " << &rval << " "; cout << endl; cout << "jval = " << jval << " "; cout << "&jval = " << &jval << " "; cout << endl;cout << endl; *pi = xval; cout << "pi = " << pi << " "; cout << "&pi = " << &pi << " "; cout << "*pi = " << *pi << " "; cout << endl; cout << "jval = " << jval << " "; cout << "&jval = " << &jval << " "; cout << endl;return 0;}一次的执行结果如下:ival = 1024 &ival = 0012FF7Cpi = 0012FF7C &pi = 0012FF78 *pi = 1024rval = 1024 &rval = 0012FF7Cjval = 4096 &jval = 0012FF70ival = 4096 &ival = 0012FF7Cpi = 0012FF70 &pi = 0012FF78 *pi = 4096rval = 4096 &rval = 0012FF7Cjval = 4096 &jval = 0012FF70pi = 0012FF70 &pi = 0012FF78 *pi = 8192jval = 8192 &jval = 0012FF70
2023-07-26 16:43:051

请问turbo pascal中的pointer类型如何使用,能否句个例子?

var p: ^integer;begin new(p); readln(p^); writeln(p^+1); dispose(p);end.
2023-07-26 16:44:032

指针变量pointer=100不对吗

程序编译起来没问题,只是有警告,可以运行。但是这样用法很不好,因为你赋的整数值是随便选的,对程序来讲没有意义。并且如果你赋的值刚好指向系统内存的关键位置,很有可能会引起系统崩溃。实际上可以将整数赋值给一个指针变量,但是不要这样做。
2023-07-26 16:44:101

鼠标手型,css怎样使鼠标移到div上显示手型

<html><body><p>请把鼠标移动到单词上,可以看到鼠标指针发生变化:</p><div style="cursor:pointer">Pointer</div><br /></body></html>。 给div添加设置cursor:pointer属性就可以了。cursor 属性规定要显示的光标的类型(形状),该属性定义了鼠标指针放在一个元素边界范围内时所用的光标形状,pointer就是手型
2023-07-26 16:44:352

STEP 7 以哪种格式存储POINTER参数类型?

STEP 7以 6 个字节保存POINTER参数。显示了用于保存POINTER参数类型的内存区域以及每个字节中保存的数据。POINTER参数类型保存了下列信息: DB号(如果DB中没有保存任何数据时为0)。 CPU中的内存区域(表格中列出了不同内存区域的十六进制代码)。数据的地址(按照Byte.Bit格式)。 如果将形式参数声明为POINTER参数类型,则只需要指定内存区域和地址。STEP 7自动将输入项目的格式转换为指针格式。
2023-07-26 16:44:492

C++中指针做为参数传递

//box_grid *start = new box_grid;//box_grid *pointer = new box_grid;//pointer = start;上面pointer指针没必要分配空间,你只是单纯的指向start地址而已,直接写box_grid *pointer = start;就可以了;//ppointer -> next ->box_grid_l_value = ssnail_m;//(*(*ppointer).next).box_grid_v_value = ssnail_n;这两句话左边的表达式表述的意思一样啊ppointer -> next ->box_grid_l_value ==(*(*ppointer).next).box_grid_v_value ,另外,你指针还有好多需要学习,指针作为函数参数传递,能改变实参指针所指向的内容,不能改变实参指针地址
2023-07-26 16:45:083

Delphi中DLL调用后如何完全释放

Delphi有静态加载Dll和动态加载Dll,静态加载的Dll不用我们释放;动态加载需要我们自己释放;这里只附上动态加载DLL的释放(此处Dll和Exe程序在同一路径下):procedure TForm1.Button2Click(Sender: TObject);var MyHandle:THandle ;FPointer:Pointer;MyDll_Func: function (s:string):Integer;stdcall;begintrytryMyHandle:=LoadLibrary("project1.Dll") ;if MyHandle<>0 thenbeginFPointer:=GetProcAddress(MyHandle ,PChar(Edit1.text));if FPointer<>nil thenbeginMyDll_Func:=FPointer;MyDll_Func(Edit1.text) ;endelseShowMessage("此"+Edit1.text+"方法,在project1.Dll中不存在");endexceptshowmessage("加载project1.Dll异常");end;finallyFreeLibrary(MyHandle) ;end;end;
2023-07-26 16:45:151

请问这段C语言是什么意思(关于POINTER_32的定义)

这是甚麼鬼满意解答,根本是废材
2023-07-26 16:45:264

C语言题目求解

1)&*pointer_1=&(a)=&a 因为pointer_1=&a-->*pointer_1=a 2) *&a=a 先取a的地址,再取地址里面的值,不还是a嘛。 3) (pointer_1)++和pointer_1++的区别:没有区别 应该是 *(pointer_1)++和*pointer_1++还有*(++pointer_1)的区别: *(pointer_1)++和*pointer_1++没有区别;都是先使用数值*(pointer_1)然后指针pointer_1加1; *(++pointer_1)是先使指针pointer_1加1再使用它此时指向的值。比如 int a[]={1,2,3},*pointer_1;pointer_1=a=2000H; *(pointer_1)++=*pointer_1++=1;然后pointer_1=2004H(int vc下占4个字节,tc下占2个字节) 但如果p=a=2000H;那么*(++pointer_1)=2;开始先使p=2004H,然后输出其对应的数2 实践出真知!上机操作就知道了。
2023-07-26 16:45:361

两个指针变量的比较

比如char[100]两个指针指向字符串的某个位置,比如point2指向字符串头,point1指向字符串的中间,则point1>point2。这种写法用于判断指向同一个数组(最经常是字符数组,即字符串)的位置的前后,因为对于一个数组,其内存空间是连续分配的
2023-07-26 16:45:461

在C语言中一个指针占用多少字节。

指针占用多少字节,取决于所使用的编译器版本,编译器有16位、32位、64位之分,16位和32位编译器可以运行在32位操作系统上,而64位操作系统可以运行这三种编译器。16位编译器下,一个指针占用2字节;32位编译器下,一个指针占用4字节;64位下,一个指针占用8字节。当前(2019年1月)国内大部分电脑已经使用上了64位Windows操作系统,但Visual Studio等编程软件默认使用的编译器是32位编译器,因此最常见的情况是一个指针占用 4 个Byte。苹果的macOS系统自带clang编译器,默认是64位,因此通常在苹果电脑上编写c语言程序时,指针占用8个字节。
2023-07-26 16:45:5711

C语言 编程为什么出现 pointer required on left side of -> in function main

建议这样写 :把“struct fan *p,*pend”改为struct fan *p[30],这样p就是一个指针类型的数组,为题就能解决!
2023-07-26 16:47:303

什么是back pointer(反向指针)?

A back pointer is an accessory frequently used in radiation therapy to pinpointthe exitb eam centre on the patient"s skiUn.s e of this accessory facilitatespositioning the patient for treatment so that the prescribed exit point, oftendelineated by skin marks, can be brought readily intoco incidence with the exitbeam centre. The laser device described here illuminates a single plane relevantto the patient set-up procedures.参考:http://www.iop.org/EJ/article/0031-9155/18/6/007/pbv18i6p881.pdf?request-id=f9702100-fb8d-4d6d-924c-ba8c1ecc5fdb
2023-07-26 16:48:451

关于指针的这段代码哪里错了,该怎么改

int swap() 要有返回值
2023-07-26 16:48:522

cursor pointer是什么意思

这是css里的吧意思就是鼠标指针变成 手 的形状,和放到链接上面的鼠标指针一样。
2023-07-26 16:48:591

Visual C++ 各种字母的标识含义

  全局变量   g_   常量   c_   c++类成员变量   m_   静态变量   s_   类型部分   指针   p   函数   fn   无效   v   句柄   h   长整型   l   布尔   b   浮点型(有时也指文件)   f   双字   dw   字符串   sz   短整型   n   双精度浮点   d   计数   c(通常用cnt)   字符   ch(通常用c)   整型   i(通常用n)   字节   by   字   w   实型   r   无符号   u   描述部分   最大   Max   最小   Min   初始化   Init   临时变量   T(或Temp)   源对象   Src   目的对象   Dest
2023-07-26 16:49:092

匈牙利命名法的反对声音

匈牙利命名法是一种编程时的命名规范。命名规范是程序书写规范中最重要也是最富争议的地方,自古乃兵家必争之地。命名规范有何用?四个字:名正言顺。用二分法,命名规范分为好的命名规范和坏的命名规范,也就是说名正言顺的命名规范和名不正言不顺的命名规范。好的舞鞋是让舞者感觉不到其存在的舞鞋,坏的舞鞋是让舞者带着镣铐起舞。一个坏的命名规范具有的破坏力比一个好的命名规范具有的创造力要大得多。有人认为,匈牙利命名法是一个坏的命名规范。举例说明。以静态强类型编程语言为例,分析范本为C语言和C++语言。下文中的匈法为匈牙利命名法的简称。 匈牙利命名法的收益是含糊的,无法预期的。范本1:strcpy(pstrFoo,pcstrFoo2) Vs strcpy(foo,foo2)没有一个程序员会承认自己不知道strcpy函数的参数类型,所以收益为零。范本2:unknown_function(nFoo) Vs unknown_function(foo)收益仍是没有的。对于一个不知道确定类型的函数,程序员应该去查看该函数的文档,这是一种成本。使用匈法的唯一好处是看代码的人知道这个函数要求一个整型参数,这没有任何用处。函数是一种接口,参数的类型仅仅是接口中的一小部分。诸如函数的功能、出口信息、线程安全性、异常安全性、参数合法性等重要信息还是必须查阅文档。范本3:nFoo=nBar Vs foo=bar使用匈法的唯一好处是看代码的人知道这里发生了一个整型变量的复制动作,听起来没什么问题,可以安心了。如果他看到的是nFoo=szBar,就没办法放心下来了。但是事情并非如此。首先出现问题的应该是编译器。另一方面,nFoo=nBar只是在语法上合法而已,看代码的人真正关心的是语义的合法性,匈法对此毫无帮助。另一方面,一个优秀的书写者会自觉地遵从一个法则:代码最小组织单位中的临时变量以一两个为宜,如果超过三个就应该重新组织。结合前述第一个法则,可以得出这样的结论:易于理解的代码本身就应该是易于理解的,这是代码的内建高质量。好的命名规范对内建高质量的助益相当有限,而坏的命名规范对内建高质量的损害比人们想象的要大。 匈牙利命名法在C语言是难以实施的,在C++语言中是无法实施的。匈法是类型系统的冗余,所以实施匈法的关键是我们是否能够精确地对类型系统进行复制。这取决于类型系统的复杂性。C语言:1.内置类型:int,char,float,double 复制为 n,ch,f,d?好像没有什么问题。但是void应该怎么表示,匈法做不到。2.组合类型:array,union,enum,struct 复制为 a,u,e,s?并不方便。这里的难点不是为主类型取名,而是为副类型取名。an表示整型数组?sfoo,sbar表示结构foo,结构bar?ausfoo表示联合结构foo数组?非常冗繁。3.特殊类型:pointer。pointer在理论上应该是组合类型,但是在C语言中可以认为是内置类型,因为C语言并没有非常严格地区分不同的指针类型。C++语言:1.class:如果说C语言中的struct还可以用stru搪塞过去的话,不要梦想用cls来搪塞C++中的class。严格地讲,class根本就并不是一个类型,而是创造类型的工具,在C++中,语言内置类型的数量和class创造的用户自定义类型的数量相比完全可以忽略不计。stdvectorFoo表示标准库向量类型变量Foo,是不合乎逻辑的。2.命名空间:boostfilesystemiteratorFoo,表示boost空间filesystem子空间遍历目录类型变量Foo,依旧不可行。3.模板:std::map<std::string,std::string>类型的确切名字是什么,已经超过了255个字符。4.模板参数:template <class T, class BinaryPredicate>const T& max(const T& a, const T& b, BinaryPredicate comp) 这一条来用匈牙利命名法命名,难度极大。5.类型修饰:static,extern,mutable,register,volatile,const,short,long,unsigned 加上类型修饰,更是难上加难。匈牙利命名法有其优点但也有缺点,这就需要在使用中扬长避短,合理应用它。
2023-07-26 16:49:161

C++ 为什么 Dynamic Binding 必须使用 Pointer

BaseClass c = DerivedClass(); 这句话实际上生成一个临时的DerivedClass对象 再赋值给c相当于这两句话。DerivedClass c1();BaseClass c=c1;因此最终得到的c和原来的c1没有关系,因为复制成BaseClass 对象了 c根本不是DerivedClass对象,怎么会有DerivedClass的虚函数呢?BaseClass* c = new DerivedClass(); 这个是指针,那没有两个不同的对象,动态绑定,绑定到同一个地址啊。c->foo() 和 (*c).foo() 没有性能区别
2023-07-26 16:49:313

这个ISO C++ forbids comparison between pointer and integer是怎么回事?

单引号双引号错误
2023-07-26 16:49:402

VB拦截message消息

在Windows使用SetWindowsHookEx来实现hook(钩子)。钩子分类很多,其中消息钩子可以获取对象所接受大部分Message消息。不管是消息钩子或键盘钩子或其他钩子,安装钩子的SetWindowsHookEx函数需要一个回调函数指针。Windows收到某个消息以后确认并且发送应用程序前通知我们的回调函数。钩子有两种1)全局钩子,也就是说我们的程序可以拦截所有外部程序收的的消息。2)非全局钩子,拦截当前进程所收到的消息。为了实现全局钩子,回调函数必须在DLL中。好像用VB不能编写真正的动态链接库。以下是简单代码:"Option Explicit"uses" Windows, Messages, SysUtils, TlHelp32;"Delphi 中一些头引用,相当于C++的 *.h"键盘HOOK类型Private Type tagKBDLLHOOKSTRUCT vkCode As Long scanCode As Long flags As Long time As Long dwExtraInfo As LongEnd Type"定义API函数指针,VB不支持该定义"RegSerProc=Function(dwProcessID,dwType:Integer):Integer;stdcall;Const WH_KEYBOARD_LL = 13Const WH_MOUSE_LL = 14"钩子消息及指针Private lpMsg As TagMsgPrivate lpHook As Long"动态调用DLL函数指针Private hDll As Long"VB不支持该定义"RegPointer:POINTER;"RegServiceProc:RegSerProc;"版本Private OsInfo As OSVERSIONINFO"QQ窗口的一些句柄Private buf_hWnd As Long "前台窗口句柄Private CheckBuf_hWnd As Long "判断是否还是前台窗口句柄Private RichChat_hWnd As Long "RichEdit20A句柄Private CheckPaste As Long "判断是否在进行粘贴"定时执行程序Sub TimerWork() MessageBox 0, "一个消息", "哈哈", 64End Sub"粘贴代码Sub PasteMsg() Dim hMem As Long Dim pStr() As Byte Dim S As String S = vbCrLf + vbCrLf + "恭喜你,你已经中招了!哈哈" hMem = GlobalAlloc(GHND Or GMEM_SHARE, (LenB(S) * 2) + 4) pStr = GlobalLock(hMem) lstrcpy pStr(0), S GlobalUnLock hMem OpenClipboard 0 EmptyClipboard SetClipboardData CF_TEXT, hMem CloseClipboard GlobalFree hMem "发送WM_PASTE对QQ2006 and 2007 已经不起作用 "PostMessage(lphWnd,WM_PASTE,0,0); CheckPaste = True keybd_event VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0 keybd_event Ord("V"), MapVirtualKey(Ord("V"), 0), 0, 0 keybd_event Ord("V"), MapVirtualKey(Ord("V"), 0), KEYEVENTF_KEYUP, 0 keybd_event VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0 CheckPaste = FalseEnd Sub"Enum窗口Function EnumProc(ByVal hWnd As Long, ByVal lParam As Long) As Boolean Dim RichName As String, ParentName As String "RichEdit20A,AfxWnd42类名 Dim RichBuf As String * 255, ParentBuf As String * 255 Dim ParenthWnd As Long "获取父窗口,通过AfxWnd42进行窗口查找 ParenthWnd = GetParent(hWnd) GetClassName hWnd, RichBuf, 256 RichName = Left(RichBuf, InStr(RichBuf, vbNullChar) - 1) If RichChat_hWnd > 0 Then EnumProc = False Exit Function End If If LCase(RichName) = "richedit20a" Then "获取父窗口类名 If ParenthWnd <> 0 Then GetClassName ParenthWnd, ParentBuf, 256 ParentName = Left(ParentBuf, InStr(ParentBuf, vbNullChar) - 1) End If "通过父窗口类名进行比较,判断是否为输入窗口 If LCase(ParentName) = "afxwnd42" Then PasteMsg RichChat_hWnd = hWnd EnumProc = False Exit Function End If End If "继续查找子窗口 EnumChildWindows hWnd, AddressOf EnumProc, 0 EnumProc = TrueEnd Function"Hook代码Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim qqBuf As String * 255 Dim frmBuf As String * 255 Dim frmName As String "窗口名称 Dim clsName As String "获取类名 Dim p As KBDLLHOOKSTRUCT "键盘按键指针类型 If nCode = HC_ACTION Then If (wParam = WM_KEYDOWN) And (Not CheckPaste) Then begin "p:=PKBDLLHOOKSTRUCT(lParam); "此处应该翻译为以下: CopyMemory p, ByVal lParam, Len(p) "判断是否Ctrl+V发送 If (p.vkCode = VK_RETURN) And ((GetKeyState(VK_CONTROL) And &H8000) <> 0) Then "获取当前前台窗口 buf_hWnd = GetForegroundWindow GetWindowText buf_hWnd, frmBuf, 256 GetClassName buf_hWnd, qqBuf, 256 frmName = Left(frmBuf, InStr(frmBuf, vbNullChar) - 1) "该地方只是一个处理而已 clsName = Left(qqBuf, InStr(qqBuf, vbNullChar) - 1) "通过判断是否还是当前窗口,如果不是则执行重复操作 If (CheckBuf_hWnd <> buf_hWnd) Then CheckBuf_hWnd = buf_hWnd "查找QQ窗口 If (InStr(clsName, "#32770") > 0) And ((InStr(frmName, "聊天中") > 0) Or (InStr(frmName, " 群") > 0)) Then "重新初始化QQ编辑控件句柄 If RichChat_hWnd <> 0 Then RichChat_hWnd = 0 "遍历子窗口进行查找 EnumChildWindowsmbuf_hWnd , AddressOf EnumProc, 0 End If "如果是原来窗口,那么直接进行处理操作 ElseIf (InStr(clsName, "#32770") > 0) And ((InStr(frmName, "聊天中") > 0) Or (InStr(frmName, " 群") > 0)) Then PasteMsg End If End If End If HookProc = CallNextHookEx(lpHook, nCode, wParam, lParam)End FunctionPublic Sub Main() "注册钩子时先判断操作系统版本 OsInfo.dwOSVersionInfoSize = Len(OsInfo) GetVersionEx OsInfo If OsInfo.dwPlatformId = VER_PLATFORM_WIN32_NT Then "如果是NT系统那么向系统注册钩子 lpHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf HookProc, hInstance, 0) 如果向系统注册钩子失败 If lpHook <= 0 Then SetTimer 0, 0, 500, AddressOf TimerWork Else "向9x注册系统服务 hDll = LoadLibrary("kernel32.dll") RegPointer = GetProcAddress(hDll, "RegisterServiceProcess") If RegPointer <> 0 Then "VB不支持该指针,所以就不翻译了 "RegServiceProc:=RegSerProc(RegPointer); "RegServiceProc(GetCurrentProcessID,1); Else "如果没有向9x注册成功服务器,以Timer进行操作 SetTimer 0, 0, 500, AddressOf TimerWork End If End If "消息循环,永驻内存 Do While GetMessage(lpMsg, 0, 0, 0) TranslateMessage lpMsg DispatchMessage lpMsg LoopEnd Sub
2023-07-26 16:50:321

rec文件是什么

1、Rec是一个隐藏的文件,它是系统自动生成的,只要安装有安全卫士的程序,则计算机会自动生成一个文件名为“Rec”的一个文件夹,可以删除,但是每次启动程序时会从新自动生成这个文件。2、Rec是安装360杀毒时候自动生成的文件夹,用来保存已被隔离的文件。3、Rec是可以删掉的,只要确定隔离里面的文件已经没用了。扩展资料:运算方法:例如 Rec(8,60)=8cos60°=4。即Rec(r,θ)=r cos θ。三维坐标转化(难点):球坐标系(r,θ,φ)转化到笛卡尔仿射坐标系(即空间三维直角坐标系)。本侠刚上初二,自己想了个办法转化:分成两步Rec,先把点到球心的连线投影到仰角φ为零°的平面,形成个射影,Rec(r的射影,θ)(跟极坐标一样)求出x和y(方法前面已经提到)。然后在【球径r所在且与φ为零的平面垂直】的平面上建立一个极坐标系,自然,0°—180°那条直线也要在原球坐标系φ=0°那个平面上(建与不建无所谓,就是你们好理解)。Rec(r,φ),求出射影进而求出Z【其实也就是把射影利用勾股定理,这里啰嗦了,直观思维一下吧】,即转化完毕(x,y,z)其实也就是三步三角函数(射影长度求法:r cos φ)。参考资料来源:百度百科-REC
2023-07-26 16:48:221

一年多少天法定节假日

一、一年多少天法定节假日1、一年11天法定节假日。定义如下:(1)新年,放假1天;春节,放假3天;清明节,放假1天;劳动节,放假1天;端午节,放假1天;中秋节,放假1天;国庆节,放假3天;(2)法定节假日是根据国家法律规定的。2、法律依据:《全国年节及纪念日放假办法》第二条全体公民放假的节日:(一)新年,放假1天(1月1日);(二)春节,放假3天(农历正月初一、初二、初三);(三)清明节,放假1天(农历清明当日);(四)劳动节,放假1天(5月1日);(五)端午节,放假1天(农历端午当日);(六)中秋节,放假1天(农历中秋当日);(七)国庆节,放假3天(10月1日、2日、3日)。二、假期上班工资是多少假期上班工资如下:1、安排劳动者延长工作时间的,支付不低于工资的百分之一百五十的工资报酬;2、休息日安排劳动者工作又不能安排补休的,支付不低于工资的百分之二百的工资报酬;3、法定休假日安排劳动者工作的,支付不低于工资的百分之三百的工资报酬。
2023-07-26 16:48:251

关于职业的英语作文【带翻译】

【职业的英语作文】Choosing a career is one of the most important decisions we make in our lives. A career not only affects our daily life but also determines our future prospects. Therefore, it is essential to choose a career that suits our interests and abilities.Firstly, we should identify our interests. A career that matches our interests will bring us more enjoyment and satisfaction. We should think about what we like to do, what kind of work environment we prefer, and what kind of challenges we are willing to face.Secondly, we should assess our abilities. A career that suits our abilities will give us a better chance of success. We should consider our strengths and weaknesses, as well as our education and training background.Thirdly, we should explore different career options. We can talk to people who work in various fields, attend career fairs, or conduct online research. It is important to gather information and get a realistic view of each career option before making a decision.Finally, we should keep an open mind and be flexible. Our career choice may change over time due to various reasons, such as personal growth, economic trends, or technological advancements. Therefore, we should be prepared to adapt and learn new skills throughout our career journey.In conclusion, choosing a career requires careful consideration of our interests, abilities, and options. It is a lifelong process that requires continuous learning and adaptation. By making the right career choice, we can lead a fulfilling and meaningful life.【关于职业的中文翻译】选择职业是我们人生中最重要的决定之一。职业不仅影响我们的日常生活,还决定了我们未来的前景。因此,选择一个适合我们兴趣和能力的职业非常重要。首先,我们应该确定自己的兴趣。一个符合我们兴趣的职业会给我们带来更多的乐趣和满足感。我们应该考虑自己喜欢做什么,喜欢什么样的工作环境,以及愿意面对什么样的挑战。其次,我们应该评估自己的能力。一个适合我们能力的职业会给我们更好的成功机会。我们应该考虑自己的优势和劣势,以及自己的教育和培训背景。第三,我们应该探索不同的职业选择。我们可以与在各个领域工作的人交谈,参加职业展览会或进行在线研究。在做出决定之前,收集信息并获得每种职业选择的现实观点非常重要。最后,我们应该保持开放的心态和灵活性。由于各种原因,如个人成长、经济趋势或技术进步,我们的职业选择可能随着时间而改变。因此,我们应该准备在整个职业生涯中不断学习和适应新技能。总之,选择职业需要仔细考虑我们的兴趣、能力和选择。这是一个需要不断学习和适应的终身过程。通过做出正确的职业选择,我们可以过上充实和有意义的生活。
2023-07-26 16:48:192