⑴ 指針什麼意思
意思是一個char指針。
在計算機科學中,指針(Pointer)是編程語言中的一個對象,利用地址,它的值直接指向(points to)存在電腦存儲器中另一個地方的值。
由於通過地址能找到所需的變數單元,可以說,地址指向該變數單元。因此,將地址形象化的稱為「指針」。意思是通過它能找到以它為地址的內存單元。
大家都認為,c語言之所以強大,以及其自由性,很大部分體現在其靈活的指針運用上。因此,說指針是c語言的靈魂,一點都不為過。
同時,這種說法也讓很多人產生誤解,似乎只有C語言的指針才能算指針。basic不支持指針,在此不論。其實,pascal語言本身也是支持指針的。
從最初的pascal發展至今的object pascal,可以說在指針運用上,絲毫不會遜色於c語言的指針。
內存分配表
計算機中的內存都是編址的,就像你家的地址一樣。在程序編譯或者運行的時候,系統(可以不關心具體是什麼,可能是編譯器,也可能是操作系統)開辟了一張表。
每遇到一次聲明語句(包括函數的傳入參數的聲明)都會開辟一個內存空間,並在表中增加一行紀錄。
⑵ 指針是什麼意思
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中如何實
現:
var
a : array [1..20] of char;
ptr : pchar; //pchar 可以看作 ^char
begin
ptr := @a;
inc(ptr); // 這句等價於 c 的 ptr++;
inc(ptr, 2); //這句等價於 c 的 ptr+=2;
end;
只是,pascal中,只允許對有類型的指針進行這樣的運算,對於無類型指針是不行的。
六、動態內存分配。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
str(@str, 'teststr'); //在c中,數組的名稱可以直接作為數組首地址指針來用
//但pascal不是這樣的,因此 str前要加上取地址的運算符
strcat(@str, '_testok');
getmem(pstr, sizeof(char) * 15);
str(pstr, @str);
write(pstr);
freemem(pstr);
end;
八、函數指針。在動態調用dll中的函數時,就會用到函數指針。假設用c寫的一段代碼如下:
typedef int (*pvfn)(int); //定義函數指針類型
int main()
{
hmole hmole = loadlibrary("test.dll");
pvfn pvfn = null;
pvfn = (pvfn) getprocaddress(hmole, "function1");
pvfn(2);
freelibrary(hmole);
}
就我個人感覺來說,c語言中定義函數指針類型的typedef代碼的語法有些晦澀,而同樣的代碼在
object pascal中卻非常易懂:
type pvfn = function (para : integer) : integer;
var
fn : pvfn;
//也可以直接在此處定義,如:fn : function (para:integer):integer;
hm : hmole;
begin
hm := loadlibrary('test.dll');
fn := getprocaddress(hm, 'function1');
fn(2);
freelibrary(hm);
end;
⑶ 指針是什麼意思
指針意思如下:
在計算機科學中,指針(Pointer)是編程語言中的一個對象,利用地址,它的值直接指向(points to)存在電腦存儲器中另一個地方的值。由於通過地址能找到所需的變數單元,可以說,地址指向該變數單元。因此,將地址形象化的稱為"指針"。意思是通過它能找到以它為地址的內存單元。
在信息工程中指針是一個用來指示一個內存地址的計算機語言的變數或中央處理器(CPU)中寄存器(Register)【用來指向該內存地址所對應的變數或數組】。指針一般出現在比較接近機器語言的語言,如匯編語言或C語言。面向對象的語言如Java一般避免用指針。
指針一般指向一個函數或一個變數。在使用一個指針時,一個程序既可以直接使用這個指針所儲存的內存地址,又可以使用這個地址里儲存的函數的值。
另外,指針也指鍾表中用來指示對應時間的部件。