當前位置:首頁 » 文件傳輸 » 怎麼通過指針變數訪問整型變數
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

怎麼通過指針變數訪問整型變數

發布時間: 2022-04-26 04:29:27

『壹』 誰能教教我pascal語言中的指針如何進行實際運用

pascal語言中指針類型和動態數據結構

整型、實型、布爾型等各種簡單類型和數組、記錄、集合等各種結構類型的數據都屬於靜態類型的數據。所謂靜態類型數據是指使用前必須在程序的說明部分給出描述這種數據的類型說明(TYPE語句)或變數說明(VAR語句),以定義這類數據佔用內存空間的大小規模,使系統在程序的編譯階段能對這些變數進行內存空間的分配,空間一旦分配則不能在程序的執行過程中加以改變。現在討論另一種類型的數據,這些數據和靜態類型數據不同,它們無需在程序的變數說明部分對其進行說明,也就是系統在程序編譯階段不對這些變數分配內存空間,而是在程序的運行過程中根據需要用相應的命令動態地建立、分配內存空間,以至這種類型的數據佔用內存空間的大小規模可以動態地發生變化,故稱之為動態類型數據結構。

一、指針變數以及動態數據的產生

討論動態類型數據是如何在程序的運行階段動態地建立起來的,就要討論與之有關的一種靜態類型數據 指針。

指針類型屬於靜態的簡單類型,但和整型、實型、字元型這些簡單類型不同。首先整型、實型、字元型的變數單元中存放的是相應類型的數據,而指針類型變數單元中存放的是某種類型變數單元的地址,通過該地址可以找到這種類型的數據,所以稱它是一個指針,而這種數據就是動態數據;其次整型、實型、字元型等類型都有規定的標准標識符integer、real、char等與之對應,而指針類型則沒有相應的標准標識符。這是因為在動態數據產生的過程中,程序員關心的是指針指向一個什麼類型的數據。所以,在Pascal程序說明部分定義指針類型時必須給出該指針類型變數所指向的數據類型,即該指針類型標識何種類型的變數。

如在程序的類型說明部分有:

TYPE

pint=^integer;

pre=^real;

表明程序定義了兩種指針類型pint和pre。pint用於標識整型的變數,pre用於標識實型的變數。

若在程序的變數說明部分有指針類型變數的說明:

VAR p1,p2:pint;

q:pre

表明程序定義了三個指針變數,p1和p2是pint類型的變數,q是pre類型的變數。在程序的編譯階段,同其它簡單變數(整型、實型、字元型等)一樣,系統要給它們分配空間,這就是前面所說的指針變數是靜態變數。在內存空間分配之初,p1、p2和q變數單元還未定義,此時指針變數不指向任何一個內存變數單元,因為所需指向的動態數據單元還未產生,它們是在程序運行過程中利用p1、p2和q變數以及new過程語句動態地產生的。一旦有動態數據產生,則p1、p2變數單元中將存放動態產生的整型變數單元的地址,q變數單元中將存放動態產生的實型變數單元的地址。

動態數據的產生是系統在程序運行階段執行過程語句new(<指針變數名>)時進行,所產生的動態數據單元用:「<指針變數名>^」 來命名:

new(p1):系統動態地產生整型變數單元,即動態地給一個整型變數分配內存單元,並將該單元的地址放入p1單元中。該整型變數單元命名為p1^,表明通過p1指針可訪問這個單元的整型數據。

new(q):系統動態地產生實型變數單元,即動態地給一個實型變數分配內存單元,並將該單元地址放入q單元中。該實型變數單元命名為q ^,表明通過q指針可訪問這個單元的實型數據。

二、指針類型變數的應用以及動態數據的操作

下面討論指針類型變數的應用,即如何將整型數據或實型數據等存放到動態產生的相應的內存變數單元中,並對這些單元進行必要的操作。

首先可以用賦值語句將一個指針變數的地址值賦給另一個指針變數,如:

p2:=p1,表示將p1單元的地址值賦給p2,此時p2單元的內容也是指向某整型變數單元的地址值。

但p1:=q不行,因為在定義中可見兩指針類型所標識的類型變數不同。

下面通過一個簡單的例子看指針類型變數的應用:

PROGRAM EX00(OUTPUT);

TYPE

pint=^integer;

pre=^real;

VAR p:pint;

q:pre;

BEGIN

NEW(p);

p^ :=3;

NEW(q);

q^ :=4.5;

q^:=q^* p^;

WRITELN(q^);

DISPOSE(p);DISPOSE(q)

END.

最後語句DISPOSE(p)以及DISPOSE(q)為釋放由p和q指針所指向的變數單元。

指針類型變數所指向的數據類型可以是整型,實型,字元型等簡單類型,也可以是數組、集合、記錄等結構類型。推而廣之就有了鏈表、樹結構等的產生及其應用。

如在程序說明部分有鏈表定義:

TYPE

Lp=^Litem

Litem=RECORD

int:integer;

next:Lp

END;

在該定義中,定義了指針類型Lp,用於標識Litem記錄類型的變數。但我們注意到,在定義指針類型Lp時,Litem尚未定義,它的定義是在Lp的定義之後給出的。這種先使用後定義的情況在以上的鏈表定義中是允許的。

若在程序變數說明部分有:

VAR

L:Lp

則變數L 為一指針類型變數。在程序運行中,它的值將是一動態產生的記錄型變數單元的首地址,即L 是指向記錄型數據的指針變數。

若在程序中有:

new(L):系統動態地產生記錄型變數單元,即動態地給一個記錄型變數分配內存單元,並將所分單元的首地址放入L單元中。分配的記錄型變數命名為L^,該記錄型變數L^有兩個域,一是整型數據域L^.int,一是指向另一記錄型變數的指針域L^.next。

new(L^.next):同上,系統動態地給一個記錄型變數分配內存單元,並將所分單元的首地址放入L^.next單元中。分配的記錄型變數命名為L^.next^,該記錄型變數L^.next^ 同樣有兩個域,一是整型數據域L^.next^.int,一是指向另一記錄型變數的指針域L^.next^.next。

接下來還可有new(L^.next^.next),new(L^.next^.next^.next)……,一個鏈表數據結構就隨之產生了。但因為鏈表是一個動態數據結構,它的長度,即鏈表結點的個數是不可預測的,所以不可能用以上的語句來產生鏈表的各結點。在以下產生整型單鏈表的程序中,使用了一個跟蹤指針L,用循環的方法產生一個單鏈表:

PROGRAM EX01(INPUT,OUTPUT);

TYPE

Lp=^Litem;

Litem=RECORD

int:integer;

next:Lp

END;

VAR

head,L:Lp; i:integer;

BEGIN

NEW(head);L:=head; i:=1;

WRITE('請輸入第',i,'結點值:');

READLN(L^.int);

WHILE not eof DO

BEGIN

i:=i+1;

NEW(L^.next);L:=L^.next;

WRITE('請輸入第',i,'結點值: ');

READLN(L^.int)

END;

L^.next:=nil;

(*以上為單鏈表的產生,以下為單鏈表的輸出*)

L:=head;

WHILE L^.next<>nil DO

BEGIN

WRITELN(l^.int);

L:=L^.next

END

END.

『貳』 C(能否把一個指針變數賦值給一個整型變數

加強制轉換下可以.
比如
p=(int)p1;
而不是像你那樣的p=*p1; 這個是把指針指向的值賦值給p.
需要注意的是,對於32位及以下編譯器, 這種賦值是無損的.

p=(int)p1;
p2=(int *)p;
這時訪問*p2不會有問題.
當如果是64位,那麼就可能會導致指針賦值給int時溢出, 數值被截斷,從而出現數據丟失.

『叄』 如何使一個long類型的指針變數指向一個int類型的變數long *a;int b;b=20;

如果是32位系統,long是32位的,和int一樣,直接指向就可以了,a=(long *)&b;
如果是64位系統,long是64位的,不要去指向int型的數值,因為long會把緊挨著b存儲空間後的32位和b一起認為是一個64位整型數,不會報錯,但運算會出錯,存在很大危險

『肆』 請問通過下面的程序 指針P 是否指向了一個合法的整型變數怎樣才算 指向合法的整型變數

在函數fun中,p的確獲得了合法的s的指針;
但是由於變數s是函數內的自動變數,其地址位於堆棧上,這樣在退出函數 fun 後,該地址就失效了。
指向合法的地址,應該指獲得一個可以訪問的地址。像上面這種情況,函數內是合法的,函數外就無效。也就是說,返回的p沒有意義。

『伍』 1, 定義一個整型指針變數,一個整型變數,並將整型變數的地址賦值給指針變數,用指

int *pi;int i;
int temp;
pi=&i;
i=10;
temp=*p;

『陸』 在c語言中整形變數的指針能否賦值給整形變數

*p1
這並不是指針。。。而是指針所指向的值,temp=*p1即把這個指針所指向的值賦值給一個臨時變數
都是同一類型;
指針變數的值是指針,指針就是地址;指針變數指向的變數就不是地址了,而是一個具體的變數。
如:int
*ptr;
ptr才是指針,即ptr為指針變數
其實是一個地址,*ptr為指針變數的值,而且指針的類型是int
*

『柒』 C++中指針的用法有那些怎麼定義怎麼初始化

指針
摘自譚浩強C語言程序設計
指針是C語言中廣泛使用的一種數據類型。運用指針編
程是C語言最主要的風格之一。
利用指針變數可以表示各種數據結構;能很方便地使用數組
和字元串;並能象匯編語言一樣
處理內存地址,從而編出精練而高效的程序。指針極大地豐
富了C語言的功能。學習指針是
學習C語言中最重要的一環,能否正確理解和使用指針是我
們是否掌握C語言的一個標志。
同時,指針也是C語言中最為困難的一部分,在學習中除了
要正確理解基本概念,還必須要
多編程,上機調試。只要作到這些,指針也是不難掌握的。
10.1 地址指針的基本概念
在計算機中,所有的數據都是存放在存儲器中的。一般把存
儲器中的一個位元組稱為一個
內存單元,不同的數據類型所佔用的內存單元數不等,如整
型量占 2 個單元,字元量占 1
個單元等,在前面已有詳細的介紹。為了正確地訪問這些內
存單元,必須為每個內存單元編
上號。根據一個內存單元的編號即可准確地找到該內存單元。
內存單元的編號也叫做地址。
既然根據內存單元的編號或地址就可以找到所需的內存單
元,所以通常也把這個地址稱為指
針。 內存單元的指針和內存單元的內容是兩個不同的概念。
可以用一個通俗的例子來說明
它們之間的關系。我們到銀行去存取款時, 銀行工作人員
將根據我們的帳號去找我們的存
款單, 找到之後在存單上寫入存款、取款的金額。在這里,
帳號就是存單的指針, 存款數
是存單的內容。對於一個內存單元來說,單元的地址即為指
針,其中存放的數據才是該單元
的內容。在C語言中,允許用一個變數來存放指針,這種變
量稱為指針變數。因此,一個指
針變數的值就是某個內存單元的地址或稱為某內存單元的
指針。
圖中,設有字元變數 C,其內容為「K」(ASCII 碼為十進制
數 75),C 佔用了011A 號單元
(地址用十六進數表示)。設有指針變數 P,內容為 011A,這
種情況我們稱為 P 指向變數 C,
或說 P 是指向變數 C 的指針。
嚴格地說,一個指針是一個地址,是一個常量。而一個指針
變數卻可以被賦予不同的指
針值,是變數。但常把指針變數簡稱為指針。為了避免混淆,
我們中約定:「指針」是指地
址,是常量,「指針變數」是指取值為地址的變數。定義指
針的目的是為了通過指針去訪問
內存單元。
既然指針變數的值是一個地址,那麼這個地址不僅可以
是變數的地址,也可以是其它數
據結構的地址。在一個指針變數中存放一個數組或一個函數
的首地址有何意義呢? 因為數
組或函數都是連續存放的。通過訪問指針變數取得了數組或
函數的首地址,也就找到了該數
組或函數。這樣一來,凡是出現數組,函數的地方都可以用
一個指針變數來表示,只要該指
針變數中賦予數組或函數的首地址即可。這樣做,將會使程
序的概念十分清楚,程序本身也
譚浩強 C語言程序設計 2001年5 月1日
精練,高效。在C語言中,一種數據類型或數據結構往往都
佔有一組連續的內存單元。 用
「地址」這個概念並不能很好地描述一種數據類型或數據結
構,而「指針」雖然實際上也是一
個地址,但它卻是一個數據結構的首地址,它是「指向」一
個數據結構的,因而概念更為清
楚,表示更為明確。 這也是引入「指針」概念的一個重要
原因。
10.2 變數的指針和指向變數的指針變數
變數的指針就是變數的地址。存放變數地址的變數是指針變
量。即在C語言中,允許用
一個變數來存放指針,這種變數稱為指針變數。因此,一個
指針變數的值就是某個變數的地
址或稱為某變數的指針。
為了表示指針變數和它所指向的變數之間的關系,在程序中
用「*」符號表示「指向」,
例如,i_pointer 代表指針變數,而*i_pointer是i_pointer 所指
向的變數。
因此,下面兩個語句作用相同:
i=3;
*i_pointer=3;
第二個語句的含義是將 3 賦給指針變數 i_pointer 所指向
的變數。
10.2.1 定義一個指針變數
對指針變數的定義包括三個內容:
(1) 指針類型說明,即定義變數為一個指針變數;
(2) 指針變數名;
(3) 變數值(指針)所指向的變數的數據類型。
其一般形式為:
類型說明符 *變數名;
其中,*表示這是一個指針變數,變數名即為定義的指針變
量名,類型說明符表示本指
針變數所指向的變數的數據類型。
例如: int *p1;
表示 p1 是一個指針變數, 它的值是某個整型變數的地址。
或者說 p1 指向一個整型變數。
至於 p1 究竟指向哪一個整型變數,應由向 p1 賦予的地址
來決定。
再如:
int *p2; /*p2 是指向整型變數的指針變數*/
float *p3; /*p3 是指向浮點變數的指針變數*/
char *p4; /*p4 是指向字元變數的指針變數*/
應該注意的是,一個指針變數只能指向同類型的變數,如 P3
只能指向浮點變數,不能
譚浩強 C語言程序設計 2001年5 月1日
時而指向一個浮點變數,時而又指向一個字元變數。
10.2.2 指針變數的引用
指針變數同普通變數一樣,使用之前不僅要定義說明,而且
必須賦予具體的值。未經賦
值的指針變數不能使用,否則將造成系統混亂,甚至死機。
指針變數的賦值只能賦予地址,
決不能賦予任何其它數據,否則將引起錯誤。在C語言中,
變數的地址是由編譯系統分配的,
對用戶完全透明,用戶不知道變數的具體地址。
兩個有關的運算符:
1) &:取地址運算符。
2) *:指針運算符(或稱「間接訪問」 運算符) 。
C語言中提供了地址運算符&來表示變數的地址。
其一般形式為:
&變數名;
如&a 表示變數 a 的地址,&b 表示變數 b 的地址。變數本
身必須預先說明。
設有指向整型變數的指針變數p,如要把整型變數a 的地址賦
予p可以有以下兩種方式:
(1) 指針變數初始化的方法
int a;
int *p=&a;
(2) 賦值語句的方法
int a;
int *p;
p=&a;
不允許把一個數賦予指針變數,故下面的賦值是錯誤的:
int *p;
p=1000;
被賦值的指針變數前不能再加「*」說明符,如寫為*p=&a 也
是錯誤的。
假設:
int i=200, x;
int *ip;
我們定義了兩個整型變數 i,x,還定義了一個指向整型數的指
針變數 ip。i,x 中可存放
整數,而 ip中只能存放整型變數的地址。我們可以把 i 的地
址賦給 ip:
ip=&i;
此時指針變數 ip 指向整型變數 i,假設變數 i 的地址為
1800,這個賦值可形象理解為下
圖所示的聯系。
以後我們便可以通過指針變數 ip間接訪問變數 i,例如:
x=*ip;
運算符*訪問以ip為地址的存貯區域,而ip中存放的是變數i的
地址,因此,*ip訪問的
譚浩強 C語言程序設計 2001年5 月1日
是地址為1800的存貯區域(因為是整數,實際上是從1800開始
的兩個位元組),它就是i所佔用
的存貯區域, 所以上面的賦值表達式等價於
x=i;
另外,指針變數和一般變數一樣,存放在它們之中的值是可以
改變的,也就是說可以改變
它們的指向,假設
int i,j,*p1,*p2;
i='a';
j='b';
p1=&i;
p2=&j;
則建立如下圖所示的聯系:
這時賦值表達式:
p2=p1
就使 p2 與 p1 指向同一對象 i,此時*p2 就等價於i,而不是
j,圖所示:
如果執行如下表達式:
*p2=*p1;
則表示把 p1指向的內容賦給 p2 所指的區域, 此時就變成
圖所示
譚浩強 C語言程序設計 2001年5 月1日
通過指針訪問它所指向的一個變數是以間接訪問的形式進
行的,所以比直接訪問一個變
量要費時間,而且不直觀,因為通過指針要訪問哪一個變數,取
決於指針的值(即指向),例如
"*p2=*p1;"實際上就是"j=i;",前者不僅速度慢而且目的不明。
但由於指針是變數,我們可以
通過改變它們的指向,以間接訪問不同的變數,這給程序員帶
來靈活性,也使程序代碼編寫得
更為簡潔和有效。

『捌』 c語言中指針怎麼使用

1、使用場景

使用指針時,必須將它指向一個變數的地址或者為它分配空間方能使用,如下所示:

#include<stdio.h>

#include <stdlib.h>

int main(int argc, char const *argv[])

{

int a[5]={0,1,2,3,4};

int *b,*d;

int c=2;

int *e=a; //e指向a數組首地址

//*b=2; 無法直接初始化

//printf("%d ", *b);

e=e+2; //移動兩個地址單元

d=&c; //d指向c的地址來表示值

c=4; //修改原c變數的值,d指針的值會發生改變

b=(int *)malloc(sizeof(int));//為b分配一個int型空間來直接存儲值

*b=2;//分配空間後可以直接賦值了

printf("this is e,b,c,d :%d %d %d %d ",*e,*b,c,*d);

2、類型說明

(1)int *a :表示一個指向int型變數的指針,指向的是變數的地址單元

(2)char *b:表示一個指向char變數的指針

*a表示的是這個指針指向地址的值,a為此指針本身的地址,這點要明確,一般用*(a+1)、*(a+2)來表示值,如:

int nums[5]={0,1,2,3,4};

int *a=nums;

printf("%d %d %p ",*a,*(a+1),a);

(8)怎麼通過指針變數訪問整型變數擴展閱讀:

指針的運算

指針指向變數地址,若原變數的內容發生了變化,它本身也會發生變化,指針之間的運算一般為值運算和地址運算

(1)值運算:直接通過*運算方式,像a+*(a+1),結果為第一個元素與第二個元素相加。

int nums[5]={0,1,2,3,4};

int *a=nums;

(2)地址運算:通過a+i的方式.指針會指向a的下i個地址。

int nums[5]={0,1,2,3,4};

int *a=nums;

a=a+2;

printf("%d ",*a);

結果輸出2。

參考資料來源 :指針-網路

『玖』 c語言中指針變數怎麼理解怎麼用

指針變數是一個變數,它保存的是另一個變數的內存地址。你如果知道了這個指針變數保存的值,就可以知道它所指向變數的內存地址,於是就可以間接訪問到那一個變數。
定義:指針變數類型 *指針變數名1, *指針變數名2, ... ;
例如:
int main(void)
{
int *p; /*定義*/
int a;
p = &a; /*把a的地址賦值到p中*/
*p = 1; /*間接訪問a*/
return 0;
}
把指針作為函數的參數傳遞,可以使函數可以訪問函數外部的變數,例如:
void swap(int *a, int *b)
{
int c;
c = *a; *a = *b, *b = c;
}
指針也可以用於傳遞數組,數組名本身就是一個指針:
void func(int a[], int n)
{ ..... }
指針還可以指向指針,指向結構體(struct),指向數組
int **p; /*指向int指針*/
struct XXX *p;
int (*p)[100]; /*指向一個int[100]數組,括弧不可少*/

『拾』 定義一個指向整型變數的指針變數,用該指針變數

冒泡法排序:

#include<stdio.h>

int main()

{int i,j,t,a[10]={15,5,9,2,7,11,8,3,12,1},*p;

for(i=0;i<9;i++)

for(p=a;p<a+9-i;p++)

if(*p>*(p+1))

{t=*p;*p=*(p+1);*(p+1)=t;}

for(i=0;i<10;i++)

printf("%d ",a[i]);

return 0;

}

選擇法排序:

#include<stdio.h>

int main()

{int i,j,t,a[10]={15,5,9,2,7,11,8,3,12,1},*p,*q;

for(i=0;i<9;i++)

{for(q=a+i,p=q+1;p<a+10;p++)

if(*q>*p)q=p;

t=a[i];a[i]=*q;*q=t;

}

for(i=0;i<10;i++)

printf("%d ",a[i]);

return 0;

}