tft每日頭條

 > 生活

 > 指針變量的用法講解

指針變量的用法講解

生活 更新时间:2024-11-30 14:36:20

指針變量定義及引用

1指針是什麼

如果在程序中定義了一個變量,在對程序進行編譯時,系統就會給這個變量分配内存單元空間。

編譯系統根據程序中定義的變量類型,分配一定長度的空間。

内存的管理将内存抽象看作一個很大的一維字符數組,對内存中的每一個字節分配一個32位或64位的編号(與32位或者64位處理器相關),把對這個編号分配稱之内存處理。

例如, 為整數變量分配4個字節(32位),為單精度浮點型變量分配4個字節,為字符型變量分配1個字節。内存區的毎一個字節有一個編号,這就是“地址”。在地址所标志的内存單元中存放的數據,由于通過地址能找到所需的變量單元,地址指向該變量單元。将地址形象化地稱為“指針”。意思是通過它能找到以它為地址的内存單元。

在 C 語言中,數據是分類型的,對不同類型的數據,在内存中分配的存儲單元大小(字節數)和存儲方式是不同的。如果隻是指定了地址1010,希望從該單元中調出數據,這是做不到的,雖然能找到所指定的存儲單元空間地址,但無法确定是從1個字節中取信息(字符數據),還是從2個字節取信息(短整型),抑或是從4個字節取信息(整型),未說明按何種存儲方式存取數據(整數和單精度實數都是4個字節,但存儲方式是不同的),隻知地址根本提取不了。為了有效地存取一個數據,除了需要位置信息外,還需要有該數據的類型信息(如果沒有該數據的類型信息,隻有地址位置信息是無法對該數據進行存取的)。 C 語言中的地址包括位置信息(内存編号)和它所指向的數據的類型信息,或者說它是“帶類型的地址”。如&a ,一般稱它為“變量 a 的地址”,确切地說,它是“整型變量 a 的地址”。

内存空間随使用随時分配,不用立即釋放空間,這說明依靠地址找到存放在地點,根據類型找到存放位置,按随用随分配,不用立即讓出,以是否工作确定是否分配空間,說明根據地址及指向變量類型确定首個對象就是存取對象,因此指針變量既要地址及指向對象的類型。

若有 int 型變量 a 和 float 型變量 b ,如先後把它們分配在2000開始的存儲單元中,&a 和&b的信息是不相同的,雖然存儲單元的地址編号相同,但它們的數據類型不同,存取編号地址相同,但是存取位置小地點(存儲單元内容類型)是不同的。

區分數據類型的本質作用,是為了合理的利用内存空間。基本類型:char,short,int,long,float,double,

char占用1個字節空間

char ch;

printf( " sizeof (ch)=%d\ n ",sizeof( ch));

//ch占一個字節

int num;

printf( sizeof (num)=%d\ n ",sizeof( num)); //4個字節

1Byte存放8位二進制位

1bit隻能存放 0或1

指針變量:

編号(地址):内存中每一個字節分配一個編碼,

定義一個變量存放上面的号碼這樣的變量叫做指針變量。

存儲單元的地址和存儲單元的内容是有區别,假設程序已定義了3個整型變量 i,j,k ,在程序編譯時,系統可能分配地址為2000~2003的4個字節給變量i,2004~2007的4個字節給 j,2008~2011的4個字節給 k (不同的編譯系統在不同次的編譯中,分配給變量的存儲單元的地址更是不相同的,因為随用随分配,用完即讓出空間)。

在程序中一般是通過變量名來引用變量的值,這裡指輸出。例如:

printf ("% d \n", i );

由于在編譯時,系統已為變量 i 分配了按整型存儲方式的4個字節,并建立了變量名和地址的對應表,因此在執行上面語句時,首先通過變量名找到相應的地址,從該4個字節中按照整型數據的存儲方式讀出整型變量 i 的值,然後按十進制整數格式輸出。

注意:對變量的訪問(這裡指錄入數據,輸入變量值對應地址,直接存入數據到對應地址)都是通過地址進行的。

假如有輸入語句

scanf( "% d ",&i);

在執行時,把鍵盤輸入的值送到地址為2000開始的整型存儲單元中。如果有語句

k=i j;

則從2000~2003字節取出 i 的值(如i=3),再從2004~2007字節取出 j 的值(如j=6),将它們相加後再将其和(k=9)送到 k 所占用的2008~2011字節單元中。

這種直接按變量名進行的訪問,稱為“直接訪問”方式。

還可以采用另一種稱為“間接訪問”的方式,即将變量 i 的地址存放在另一地址變量中,然後通過該地址變量來找到變量 i 的地址,從而訪問 i 變量。

在 C 語言程序中,可以定義整型變量、浮點型(實型)變量、字符變量等,也可以定義一種特殊的變量,用它存放地址。假設定義了一個變量 i_pointer (變量名可任意取),用來存放整型變量的地址。可以通過下面語句将 i 的地址(2000)存放到 i_pointer 中。

//将 i 的地址存放到 i_pointer 中i_pointer =& i ;(把對應地址賦值給地址變量,不是指針變量,是專門存地址編号的變量,類似普通變量,未賦值*p的指針變量p=&i,是間接訪問。

這時, i _ pointer 的值就是2000(即變量 i 所占用單元的起始地址,變量占4字節)。根據存儲空間編号起始址加上類型決定的長度,間接存取指定變量。

void test()

int num =100;

//取變量的地址用&

// &num 代表标量 num 的起始地址

int *p

printf (" p \ n ", &num );

//定義一個指針變量,保存 num的地址

//在定義的時候:*說明 p 是指針變量,而不是普通變量 int *p= null;

printf (" sizeof ( p ) =d \ n ", sizeof ( p ));

// num的地址與p建立關系

p=&num ;

printf (" num = d \ n ", num );

//使用中;*p表示取 p 保存的地址編号對應空間的内容

printf (" p = d \ n ", *p );

//100

要存取變量 i 的值,既可以用直接訪問的方式,也可以采用間接訪問的方式:先找到存放“變量 i 的地址”的變量 i_pointer ,從中取出 i 的地址(2000),然後到2000字節開始的存儲單元中取出 i 的值。

直接訪問:根據變量名直接向變量 i 賦值,由于變量名與變量的地址有一一對應的關系,因此就按此地址直接對變量 i 的存儲單元進行訪問(如把數值3存放到變量 i 的存儲單元中)。i=3;

間接訪問:先找到存放變量 i 地址的變量 i _ pointer ,從其中得到變量 i 的地址(2000),從而找到變量 i 的存儲單元,然後對它進行存取訪問。

為了表示将數值3送到變量中,可以有兩種表達方法:

(1)将3直接送到變量 i 所标識的單元中,例如“ i =3;”。

(2)将3送到變量 i_pointer 所指向的單元(即變量 i 的存儲單元),例如“* i _ pointer =

3;”,其中* i _ pointer 表示 i_pointer 指向的對象。

指向就是通過地址來體現的。假設 i_pointer 中的值是變量 i 的地址(起始地址編号為2000),這樣就在 i_pointer 和變量 i 之間建立起一種聯系,即通過 i _ pointer 能知道 i 的地址,從而找到變量i 的内存單元。

由于通過地址能找到所需的變量單元,因此說,地址指向該變量單元。将地址形象化地稱為“指針”。意思是通過它能找到以它為地址的内存單元(如同根據地址2000就能找到變量 i 的存儲單元一樣)。

如果有一個變量專門用來存放另一變量的地址(即指針),則它稱為“指針變量”。上述的 i _ pointer 就是一個指針變量。指針變量就是地址變量,用來存放地址,指針變量的值是地址(即指針)。

區分“指針”和“指針變量”這兩個概念。

例如,可以說變量 i 的指針是2000,而不能說 i 的指針變量是2000。指針是一個地址(起始地址編号),而指針變量是存放地址的變量。

2指針變量

存放地址的變量是指針變量,它用來指向另一個對象(如變量、數組、函數等)。

内存區的每一個字節都有一個編号,這就是“地址”。

指針的實質就是内存“地址”。指針就是地址,地址就是指針。

指針是内存單元的編号,指針變量是存放地址的變量

任意類型的指針在32位平台都是4字節(32位)。

2.1定義和使用指針變量

例:通過指針變量訪問(提取)整型變量。

先定義2個整型變量,再定義2個指針變量,分别指向這兩個整型變量,通過訪問指針變量,可以找到它們所指向的變量,再提取這些變量的值。

編寫程序:

# include < stdio.h >

int main( )

int a =100,b=10;

int *pointer _1,pointer_2;

pointer _1=& a;

pointer _2=& b ;

printf (" a =% d,b =% d \ n",a,b );

printf (" pointer _1=% d , pointer _2=% d \ n" , *pointer _1, *pointer _2);

//定義整型變量a,b,并初始化

//定義指向整型數據的指針變量 pointer _1, pointer _2

//把變量 a 的地址賦給指針變量 pointer _1

//把變量 b 的地址賦給指針變量 pointer _2

//輸出變量 a 和 b 的值

//輸出變量 a 和 b 的值

return 0;

運行結果:

a =100, b=10

*pointer _1=100, *pointer _2=10;

(1)在開頭處定義了兩個整型指針變量* pointer _1和*pointer _2。規定它們可以指向整型變量,至于指向哪一個整型變量,要在程序語句中指定。使 pointer _1指向 a,pointer _2指向b,此時 pointer _1的值為& a , pointer _2的值為& b 。

(2)輸出變量 a 和 b 的值100和10。輸出* pointer _1和* pointer _2的值。其中的“*”表示“向”。* pointer _1表示“指針變量pointer _1所指向的變量”,也就是變量 a 。“ pointer _2表示“指針變量pointer2所指向的變量”,也就是變量 b 。從運行結果看到,它們的值也是100和10。

(3)程序中有兩處出現 pointer _1和 pointer _2,二者的含義不同。* pointer _1和* pointer _2表示定義兩個指針變量,變量名為 pointer _1和 pointer _2。它們前面的“*”隻是表示該變量是指針變量。程序最後一行 printf 函數中的* pointer _1和 *pointer_2則代表指針變量pointer_1和 pointer _2所指向的變量。

定義指針變量時,左側應有類型名,否則就不是定義指針變量。如:

int * pointer _1;

2.2怎樣定義指針變量

定義指針變量的一般形式為

類型名 *指針變量名;

如:

int *pointer _ 1 , *pointer _2;

左端的 int 是在定義指針變量時必須指定的“基類型”。指針變量的基類型用來指定此指針變量可以指向的變量的類型,并不是地址類型

例如,上面定義的基類型為 int 的指針變量 pointer _1和 pointer _2,可以用來指向整型的變量 i 和 j ,但不能指向浮點型變量 a 和 b 。

基本的數據類型如 int , char , float 等,既然有這些類型的變量,就可以有指向這些類型變量的指針,因此,指針變量是基本數據類型派生出來的類型,它不能離開基本類型而獨立存在。

下面都是合法的定義: float * pointer _3;

char *pointer _4;

可以在定義指針變量時,同時對它初始化,一般不在定義時賦值。如:

int * pointer _1=& a ,* pointer _2=& b ;上面程序應改寫成

int * pointer _1,* pointer _2 ;

pointer _1=& a ;

pointer _2=& b ;

因為 a 的地址是賦給指針變量名為 pointer _1,而不是把a地址賦給 *pointer _1(相當變量 a本身 )。

說明:在定義指針變量時要注意:

(1)指針變量前面的“*”表示該變量為指針型變量。指針變量名是 pointer _1和pointer _2,而不是* pointer _1和着* pointer _2。這是與定義整型或實型變量的形式不同的。

(2)在定義指針變量時必須指定基類型。有人認為既然指針變量是存放地址的,那麼隻須指定其為“指針型變量”即可,為什麼還要指定基類型呢?

要知道不同類型的數據在内存中所占的字節數和存放方式是不同的。

指向一個整型變量和指向一個實型float變量,其物理上的含義是不同的。

指針變量是用來存放地址的,C 的地址信息包括存儲單元的位置(内存編号)和類型信息(存儲長度)。指針變量的屬性應與之匹配。

如:

int a ,* p ;

p =& a ;

& a 不僅包含變量 a 的位置(如起始編号為2000的存儲單元),還包括“存儲的數據是整型”的信息。現在定義指針變量 p 的基類型為 int ,

即它所指向的隻能是整型數據。這時 p 能接受& a 的信息。如果改為

float * p;

p =&a ;

& a 是“整型變量 a 的地址”。

在用 Vicual C 6.0編譯時就會出現一個警告( warning ):“把一個 int 型數據轉換為 float 數據”。在賦值時,系統會把& a 的基類型自動改換為 float 型,然後賦給 p 。但是 p 不能用這個地址指向整型變量。可以知道指針或地址是包含有類型信息的。應該使賦值号兩側的類型一緻,以避免出現意外結果。

一個變量的指針的含義包括兩個方面,一是以存儲單元編号表示的純地址(如編号為2000的字節),一是它指向的存儲單元的數據類型(如 int , char , float 等)。

2.3引用指針變量

在引用指針變量時,可能有3種情況

(1)給指針變量賦值。如:

p =& a ;

指針變量 p 的值是變量 a 的地址, p 指向 a 。

(2)引用指針變量指向的變量。

如果已執行“ p =& a ;”,即指針變量 p 指向了整型變量 a ,則 printf ("% d ",* p );輸出指向的對象。

其作用是以整數形式輸出指針變量 p 所指向的變量的值,即變量 a 的值。

如果有以下賦值語句;

* p =1;

表示将整數1賦給 p 當前所指向的變量,如果 p 指向變量 a ,則相當于把1賦給 a ,即“ a = 1;”。改為int a=1;

int *p;

p=&a;

(3)引用指針變量的值。如: printf ("%",p );

作用是以八進制數形式輸出指針變量 p 的值,如果 p 指向了 a ,就是輸出了 a 的地址,即& a

&取地址運算符。& a 是變量 a 的地址。

*指針運算符(或稱“間接訪問”運算符),* p 代表指針變量 p 指向的對象。

指針變量的用法講解(指針變量定義及引用)1

解密代碼

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved