ËêÔµÄÖ¸Õë5



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ ¿´ÏÂÒ»¸ö

Óë ËêÔµÄÖ¸Õë5 ²»Ïà¹ØµÄÆäËüÊÓÆµ
Sa¶Á½â ÂÃÐеÄÒâÒå Ô¹âÇïÉ«·­³ªÄûÃÊÊ÷ ¼ÎÈç°æ¡þÐĺþÓêÓÖ·ç¡þ San¸ç¸ç(°®µÄÌìʹ)°é×à°æ ɵ¹Ï¶¼Ò»Ñù ¡îÇçƒÌÍÞÍÞ ¦Ø¨¥¨¥¦ÊY¥ãÍÆ¼öʵÁ¦ÅɨT¨n¥ë¨Ý¹ç Jay ÉϺ£1943 Ð5±`` º±¼ûÈýÔªÈËÃñ±ÒËæÖÝÏÖÉí
¹ØÓÚ Ö¸Õë µÄ°Ù¿ÆÐ¡³£Ê¶
1.ÔÚÈÕ³£Éú»îÖÐÖ¸ÕëÊÇÒÇÆ÷»òÖÓ±íÉ쵀 ¿É¶¯µÄ Ò»°ãÏÁ³¤µÄ ÍùÍùÔÚÒ»¶Î¼âµÄÓÃÀ´Ö¸Ê¾²âÁ¿µÄÊý¾ÝµÄ×°Öá£

2.ÔÚÐÅÏ¢¹¤³ÌÖÐÖ¸ÕëÊÇÒ»¸öÓÃÀ´Ö¸Ê¾Ò»¸öÄÚ´æµØÖ·µÄ¼ÆËã»úÓïÑԵıäÁ¿»òÖÐÑë´¦ÀíÆ÷(CPU)ÖмĴæÆ÷(Register)¡£Ö¸ÕëÒ»°ã³öÏÖÔڱȽϽü»úÆ÷ÓïÑÔµÄÓïÑÔ Èç»ã±àÓïÑÔ»òCÓïÑÔ¡£ÃæÏò¶ÔÏóµÄÓïÑÔÈçJavaÒ»°ã±ÜÃâÓÃÖ¸Õë¡£Ö¸ÕëÒ»°ãÖ¸ÏòÒ»¸öº¯Êý»òÒ»¸ö±äÁ¿¡£ÔÚʹÓÃÒ»¸öÖ¸Õëʱ Ò»¸ö³ÌÐò¼È¿ÉÒÔÖ±½ÓʹÓÃÕâ¸öÖ¸ÕëËù´¢´æµÄÄÚ´æµØÖ· ÓÖ¿ÉÒÔʹÓÃÕâ¸öµØÖ·Àï´¢´æµÄ±äÁ¿»òº¯Ê÷µÄÖµ¡£
´ó¼Ò¶¼ÈÏΪ cÓïÑÔÖ®ËùÒÔÇ¿´ó ÒÔ¼°Æä×ÔÓÉÐÔ ºÜ´ó²¿·ÖÌåÏÖÔÚÆäÁé»îµÄÖ¸ÕëÔËÓÃÉÏ¡£Òò´Ë ˵ָÕëÊÇcÓïÑÔµÄÁé»ê Ò»µã¶¼²»Îª¹ý¡£Í¬Ê± ÕâÖÖ˵·¨Ò²ÈúܶàÈ˲úÉúÎó½â ËÆºõÖ»ÓÐcÓïÑÔµÄÖ¸Õë²ÅÄÜËãÖ¸Õë¡£basic²»Ö§³ÖÖ¸Õë Ôڴ˲»ÂÛ¡£Æäʵ pascalÓïÑÔ±¾ÉíÒ²ÊÇÖ§³ÖÖ¸ÕëµÄ¡£´Ó×î³õµÄpascal·¢Õ¹ÖÁ½ñµÄobject pascal ¿ÉÒÔ˵ÔÚÖ¸ÕëÔËÓÃÉÏ Ë¿ºÁ²»»áÑ·É«ÓÚcÓïÑÔµÄÖ¸Õë¡£

ÒÔÏÂÄÚÈÝ·ÖΪ°Ë²¿·Ö ·Ö±ðÊÇ
Ò»¡¢ÀàÐÍÖ¸ÕëµÄ¶¨Òå
¶þ¡¢ÎÞÀàÐÍÖ¸ÕëµÄ¶¨Òå
Èý¡¢Ö¸ÕëµÄ½â³ýÒýÓÃ
ËÄ¡¢È¡µØÖ·£¨Ö¸Õ븳ֵ£©
Îå¡¢Ö¸ÕëÔËËã
Áù¡¢¶¯Ì¬ÄÚ´æ·ÖÅä
Æß¡¢×Ö·ûÊý×éµÄÔËËã
°Ë¡¢º¯ÊýÖ¸Õë

Ò»¡¢ÀàÐÍÖ¸ÕëµÄ¶¨Òå¡£¶ÔÓÚÖ¸ÏòÌØ¶¨ÀàÐ͵ÄÖ¸Õë ÔÚcÖÐÊÇÕâÑù¶¨ÒåµÄ£º
int *ptr;
char *ptr;
ÓëÖ®µÈ¼ÛµÄobject pascalÊÇÈçºÎ¶¨ÒåµÄÄØ£¿
var
ptr : ^integer;
ptr : ^char;
ÆäʵҲ¾ÍÊÇ·ûºÅµÄ²î±ð¶øÒÑ¡£

¶þ¡¢ÎÞÀàÐÍÖ¸ÕëµÄ¶¨Òå¡£cÖÐÓÐvoid *ÀàÐÍ Ò²¾ÍÊÇ¿ÉÒÔÖ¸ÏòÈκÎÀàÐÍÊý¾ÝµÄÖ¸Õë¡£object pascalΪÆä
¶¨ÒåÁËÒ»¸öרÃŵÄÀàÐÍ£ºpointer¡£ÓÚÊÇ
ptr : pointer;
¾ÍÓëcÖеÄ
void *ptr;
µÈ¼ÛÁË¡£

Èý¡¢Ö¸ÕëµÄ½â³ýÒýÓá£Òª½â³ýÖ¸ÕëÒýÓ㨼´È¡³öÖ¸ÕëËùÖ¸ÇøÓòµÄÖµ£© c µÄÓï·¨ÊÇ (*ptr) object
pascalÔòÊÇ ptr^¡£

ËÄ¡¢È¡µØÖ·£¨Ö¸Õ븳ֵ£©¡£È¡Ä³¶ÔÏóµÄµØÖ·²¢½«Æä¸³Öµ¸øÖ¸Õë±äÁ¿ c µÄÓï·¨ÊÇ
ptr = &object;
object pascal ÔòÊÇ
ptr := @object;
Ò²Ö»ÊÇ·ûºÅµÄ²î±ð¶øÒÑ¡£

Îå¡¢Ö¸ÕëÔËËã¡£ÔÚcÖÐ ¿ÉÒÔ¶ÔÖ¸Õë½øÐÐÒÆ¶¯µÄÔËËã È磺
char a[20];
char *ptr=a;
ptr++;
ptr+=2;
µ±Ö´ÐÐptr++;ʱ ±àÒëÆ÷»á²úÉúÈÃptrǰ½øsizeof(char)²½³¤µÄ´úÂë Ö®ºó ptr½«Ö¸Ïòa[1]¡£ptr+=2;Õâ¾äʹµÃptrǰ½øÁ½¸ösizeof(char)´óСµÄ²½³¤¡£Í¬Ñù ÎÒÃÇÀ´¿´Ò»ÏÂobject pascalÖÐÈçºÎʵÏÖ£º

vara : array [1..20] of char;

ptr : pchar; //pchar ¿ÉÒÔ¿´×÷ ^char

begin

ptr := @a;inc(ptr); // Õâ¾äµÈ¼ÛÓÚ c µÄ ptr++;

inc(ptr 2); //Õâ¾äµÈ¼ÛÓÚ c µÄ ptr+=2;

end;

Ö»ÊÇ pascalÖÐ Ö»ÔÊÐí¶ÔÓÐÀàÐ͵ÄÖ¸Õë½øÐÐÕâÑùµÄÔËËã ¶ÔÓÚÎÞÀàÐÍÖ¸ÕëÊDz»Ðеġ£

Áù¡¢¶¯Ì¬ÄÚ´æ·ÖÅä¡£cÖРʹÓÃmalloc()¿âº¯Êý·ÖÅäÄÚ´æ free()º¯ÊýÊÍ·ÅÄÚ´æ¡£ÈçÕâÑùµÄ´úÂ룺

int *ptr *ptr2;

int i;

ptr = (int*) malloc(sizeof(int) * 20);

ptr2 = ptr;

for (i=0; i<20; i++){

*ptr = i;

ptr++;

}

free(ptr2);

object pascalÖÐ ¶¯Ì¬·ÖÅäÄÚ´æµÄº¯ÊýÊÇgetmem() ÓëÖ®¶ÔÓ¦µÄÊͷź¯ÊýΪfreemem()£¨´«Í³pascalÖлñÈ¡ÄÚ´æµÄº¯ÊýÊÇnew()ºÍ dispose() µ«new()Ö»ÄÜ»ñµÃ¶ÔÏóµÄµ¥¸öʵÌåµÄÄÚ´æ´óС ÎÞ·¨È¡µÃÁ¬ÐøµÄ´æ·Å¶à¸ö¶ÔÏóµÄÄÚ´æ¿é£©¡£Òò´Ë ÓëÉÏÃæÄǶÎcµÄ´úÂëµÈ¼ÛµÄobject pascalµÄ´úÂëΪ£º
var ptr ptr2 : ^integer;i : integer;

begin

getmem(ptr sizeof(integer) * 20);

//Õâ¾äµÈ¼ÛÓÚcµÄ ptr = (int*) malloc(sizeof(int) * 20);

ptr2 := ptr; //±£ÁôԭʼָÕëλÖÃ

for i := 0 to 19 do

begin

ptr^ := i;

inc(ptr);

end;

freemem(ptr2);

end;

¶ÔÓÚÒÔÉÏÕâ¸öÀý×Ó£¨ÎÞÂÛÊÇc°æ±¾µÄ »¹ÊÇobject pascal°æ±¾µÄ£© ¶¼Òª×¢ÒâÒ»¸öÎÊÌâ ¾ÍÊÇ·ÖÅäÄÚ´æµÄµ¥Î»ÊÇ×Ö½Ú£¨byte£© Òò´ËÔÚʹÓÃgetmemʱ ÆäµÚ¶þ¸ö²ÎÊýÈç¹ûÏ뵱ȻµÄд³É 20 ÄÇô¾Í»á³öÎÊÌâÁË£¨ÄÚ´æ·ÃÎÊÔ½½ç£©¡£ÒòΪgetmem(ptr 20);ʵ¼ÊÖ»·ÖÅäÁË20¸ö×Ö½ÚµÄÄÚ´æ¿Õ¼ä ¶øÒ»¸öÕûÐεĴóСÊÇËĸö×Ö½Ú ÄÇô·ÃÎʵÚÎå¸öÖ®ºóµÄËùÓÐÔªËØ¶¼ÊÇ·Ç·¨µÄÁË£¨¶ÔÓÚmalloc()µÄ²ÎÊýͬÑù£©¡£

Æß¡¢×Ö·ûÊý×éµÄÔËËã¡£cÓïÑÔÖÐ ÊÇûÓÐ×Ö·û´®ÀàÐ굀 Òò´Ë ×Ö·û´®¶¼ÊÇÓÃ×Ö·ûÊý×éÀ´ÊµÏÖ ÓÚÊÇÒ²ÓÐÒ»Ì×str´òÍ·µÄ¿âº¯ÊýÒÔ½øÐÐ×Ö·ûÊý×éµÄÔËËã ÈçÒÔÏ´úÂ룺

char str[15];

char *pstr;

strcpy(str "teststr");

strcat(str "_testok");

pstr = (char*) malloc(sizeof(char) * 15);

strcpy(pstr str);

printf(pstr);

free(pstr);

¶øÔÚobject pascalÖÐ ÓÐÁËstringÀàÐÍ Òò´Ë¿ÉÒԺܷ½±ãµÄ¶Ô×Ö·û´®½øÐи÷ÖÖÔËËã¡£µ«ÊÇ ÓÐʱÎÒÃǵÄpascal´úÂëÐèÒªÓëcµÄ´úÂë½»»¥£¨±ÈÈ磺ÓÃobject pascalµÄ´úÂëµ÷ÓÃcдµÄdll»òÕßÓÃobject pascalдµÄdll×¼±¸ÔÊÐíÓÃcд¿Í»§¶ËµÄ´úÂ룩µÄ»° ¾Í²»ÄÜʹÓÃstringÀàÐÍÁË ¶ø±ØÐëʹÓÃÁ½ÖÖÓïÑÔͨÓõÄ×Ö·ûÊý×é¡£Æäʵ object pascalÌṩÁËÍêÈ«ÏàËÆcµÄÒ»ÕûÌ××Ö·ûÊý×éµÄÔËË㺯Êý ÒÔÉÏÄǶδúÂëµÄobject pascal°æ±¾ÊÇÕâÑùµÄ£º

var str : array [1..15] of char;

pstr : pchar; //pchar Ò²¾ÍÊÇ ^char

begin

strcopy(@str 'teststr'); //ÔÚcÖÐ Êý×éµÄÃû³Æ¿ÉÒÔÖ±½Ó×÷ΪÊý×éÊ×µØÖ·Ö¸ÕëÀ´ÓÃ

//µ«pascal²»ÊÇÕâÑùµÄ Òò´Ë strǰҪ¼ÓÉÏÈ¡µØÖ·µÄÔËËã·û

strcat(@str '_testok');

getmem(pstr sizeof(char) * 15);

strcopy(pstr @str);

write(pstr);

freemem(pstr);

end;

°Ë¡¢º¯ÊýÖ¸Õë¡£ÔÚ¶¯Ì¬µ÷ÓÃdllÖеĺ¯Êýʱ ¾Í»áÓõ½º¯ÊýÖ¸Õë¡£¼ÙÉèÓÃcдµÄÒ»¶Î´úÂëÈçÏ£º

typedef int (*pvfn)(int); //¶¨Ò庯ÊýÖ¸ÕëÀàÐÍ

int main()

{

hmodule hmodule = loadlibrary("test.dll");

pvfn pvfn = null;

pvfn = (pvfn) getprocaddress(hmodule "function1");

pvfn(2);

freelibrary(hmodule);}

¾ÍÎÒ¸öÈ˸оõÀ´Ëµ cÓïÑÔÖж¨Ò庯ÊýÖ¸ÕëÀàÐ͵Ätypedef´úÂëµÄÓï·¨ÓÐЩ»Þɬ ¶øÍ¬ÑùµÄ´úÂëÔÚobject pascalÖÐÈ´·Ç³£Ò×¶®£º

type pvfn = function (para : integer) : integer;

var

fn : pvfn;

//Ò²¿ÉÒÔÖ±½ÓÔÚ´Ë´¦¶¨Òå È磺fn : function (para:integer):integer;

hm : hmodule;

begin

hm := loadlibrary('test.dll');

fn := getprocaddress(hm 'function1');

fn(2);

freelibrary(hm);

end;

Ö¸Õë ¡¡¡¡ÒÔÊÖÖ¸´úÕë³ÆÖ¸Õë¡£Ö¸ÔÚÒ»¶¨Ñ¨Î»»ò²¿Î»ÉÏÓ𴡢ѹ¡¢µã¡¢ÆþµÈÊÖ·¨ÖÎÁƼ²²¡µÄ·½·¨¡£ÓÐÊæ½î»îÂç¡¢ÊèͨðöÖÍ ¿ªÇÏֹʹµÈ×÷Óᣡ¶Õë¾Ä´ó³É¡·£º¡°Èç¼±¾ª¡¢Ììµõ¾ª ÆþÊÖÉÏÇà½î¡­¡­ÒÔÉÏÊý·¨ÄËÒÔÊÖ´úÕëÖ®ÉñÊõÒ²¡£¡±ºóÈËÒò³Æ´ËΪָÕë¡£
Ö¸ÕëÊÇÒ»ÖÖÊý¾ÝÀàÐÍ ÓëÆäËüµÄÊý¾ÝÀàÐͲ»Í¬µÄÊÇÖ¸ÕëÊÇÒ»ÖÖ¡°ÓÃÀ´´æ·ÅµØÖ·ÖµµÄ¡±±äÁ¿¡£¾ÙÒ»¸ö¼òµ¥µÄÀý×Ó£º
Èç¹û¶¨ÒåÁËÒ»¸öÕûÐͱäÁ¿ ¸ù¾ÝÕûÐͱäÁ¿µÄÌØµã Ëü¿ÉÒÔ´æ·ÅµÄÊýÊÇÕûÊý¡£
È磺int a; a=100; ÕâÑù¾Í°ÑÕûÐͳ£Á¿¸³¸øÁ˱äÁ¿a¡£µ«ÊÇÈç¹ûд³ÉÕâÑù£ºa=123.33;¾Í»á³öÎÊÌâ ×îºóÊä³ö±äÁ¿aµÄÖµ½á¹ûÊÇ123¡£ÏÖÔÚ˵µ½Ö¸Õë ÆäʵµØÖ·ÖµÒ²ÊÇÒ»¸öÕûÐÍÊý Èçijij±äÁ¿µÄµØÖ·ÖµÎª36542 ˵Ã÷Õâ¸ö±äÁ¿±»·ÖÅäÔÚÄÚ´æµØÖ·ÖµÎª36542µÄµØ·½¡£Äܲ»ÄÜÕâÑù½øÐÐÍÆÀí ¼ÈÈ»µØÖ·ÖµÒ²ÊÇÕûÐÍÊý ÕûÐͱäÁ¿ÕýºÃ¿ÉÒÔÓÃÀ´´æ·ÅÕûÐÍÊý ÄDz»ÊÇÒ»¸öÕûÐͱäÁ¿¿ÉÒÔÓÃÀ´´æ·ÅµØÖ·µÄÖµÂð¡£³ÌÐòд³ÉÏÂÃæÕâÑù£º
int a b;
a=&b;
ºÜÃ÷ÏÔ ÕâÑùдÊÇ´íÎóµÄ¡£Ô­ÒòÔÚÓÚ²»Äܼòµ¥µØ°ÑµØÖ·Àí½âΪÕûÐÍÊý¡£
Ó¦ÓÐÕâÑùµÄ¶ÔÓ¦¹ØÏµ£º µØÖ·Öµ£¼£­£­£­£¾Ö¸Õ룻 ÕûÐÍÊý£¼£­£­£­£¾int ÐͱäÁ¿¡£
ËùÒÔÓÐÕâÑùµÄ˵·¨£º¡°Ö¸Õë¾ÍÊǵØÖ·¡±£¨Ö¸Õë¾ÍÊÇ´æ·ÅµØÖ·ÖµµÄÒ»ÖÖÊý¾ÝÀàÐÍ£©
ÏÂÃæÊÇÒ»¶ÎÕýÈ·µÄ³ÌÐò£º
int a *p;
p=&a; /*°Ñ±äÁ¿aµÄµØÖ·Öµ¸³¸øÖ¸Õëp*/

»úƱËÑË÷ ±ãÃñ²éÑ¯Íø 9VÎÞÏÞ³µÍø ¹ú¼Ò˾·¨¿¼ÊÔ½ÌÓýÍø Þ±Þ±»¯×±Æ·Íø ÅÄÅÄȤÊÓÆµ
»ð³µÆ±Íø ´óѧÉúÍŹºÍø BJGW Õ½¶Ó ƯÁ÷Æ¿ÍøÂç ImageMagick ÖÐÎÄÕ¾

¾©ICP±¸06059836ºÅ