溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

指針總結(jié)基礎(chǔ)

發(fā)布時(shí)間:2020-06-21 10:40:55 來(lái)源:網(wǎng)絡(luò) 閱讀:259 作者:flag不會(huì)倒 欄目:編程語(yǔ)言

如何定義指針?

存放內(nèi)存單元的地址,該地址被形象的稱為指針,存放在指針中的值都被當(dāng)成地址處理。而指針變量就是一個(gè)存放地址的變量。與普通的變量相同把它看作一個(gè)新的類型就好。

如何編址?

在32位平臺(tái)下,有32根地址線,有2^32個(gè)排列組合,因此可編2^32(4G)個(gè)地址。編址的最小單位是字節(jié)。
由于int變量占四個(gè)字節(jié),取地址取最低地址表示。(double、long同理)。
在32位機(jī)器上,地址是32個(gè)0或1組成的二進(jìn)制序列,(32/8)那地址就得用4個(gè)字節(jié)空間來(lái)存儲(chǔ),所以一個(gè)指針變量的大小就應(yīng)該是4個(gè)字節(jié)。
同理在64位機(jī)器上,有64根地址線,(64/8)因而地址要用8個(gè)字節(jié)空間來(lái)存儲(chǔ)。

指針類型表示:

type+ * (二級(jí)指針:int **,type是int*)。type*****類型的指針是為了存放某類型變量的地址。

指針類型的意義:

1.指針類型+-整數(shù):

指針的類型決定了指針向前或向后走一步有多大距離:加減上所指向類型占字節(jié)的大小。因而加1或減一是令指針指向了下或上一個(gè)一個(gè)變量、數(shù)組、結(jié)構(gòu)體。。。。
看下面例子:

int n = 10;
    int *pi = &n;
    char *pc = (char *)&n;
    printf("%p\n", pi);                       ---> 00D8F9D0
    printf("%p\n", pi+1);                    --->00D8F9D4
    printf("%p\n", pc);                        --->00D8F9D0
    printf("%p\n", pc+1);                    --->00D8F9D1

答案符合正如我們解釋的那樣
ps:二級(jí)指針、三級(jí)指針..他們指向的類型都是指針類型,所以加一或減一都會(huì)加或減4個(gè)字節(jié)。(指針?biāo)伎臻g大小為4B)

2.指針解引用:

指針的類型決定了,對(duì)指針解引用的時(shí)候有多大權(quán)限(能訪問(wèn)幾個(gè)字節(jié)),例如:char* 指針解引用就只能訪問(wèn)一個(gè)字節(jié),而int*的指針就能夠訪問(wèn)4個(gè)字節(jié)。

  int n = 0x11223344;
    int* pi = &n;
    char* pc = (char*)&n;          //解引用只能指向一個(gè)空間
    *pc=0x55;  
    printf("%x\n", n);       --->11223355   
    *pi = 0;
    printf("%x\n", n);     --->0

指針的運(yùn)算

指針-指針:

代表兩個(gè)指針之間經(jīng)歷的元素。
eg:

int a[10];
       int *p=&a[0];
       int *q =&a[9];
       則:p-q=9不是(4*9=36)
       若 char *p=(char*)&a[0];
           char *q =(char *)&a[9];
            p-q=36;  //元素個(gè)數(shù)由指針指向類型決定。
指針的關(guān)系運(yùn)算:

標(biāo)準(zhǔn)規(guī)定:允許指向數(shù)組元素的指針與指向數(shù)組最后一個(gè)元素后面的那個(gè)內(nèi)存位置的指針比較,但是不允許與指向第一個(gè)元素之前的那個(gè)內(nèi)存位置的指針比較。
對(duì)比:

for(vp=&values[N_values];vp>&values[0];)      //比較都是合法的
{
       *--vp=0;
}

for(vp=&values[N_values-1];vp>=&values[0];vp--)      //vp=-1時(shí)比較后不成立然后才退出循環(huán)!
{
       *vp=0;
}

二級(jí)指針:

存放一級(jí)指針地址的變量。
因?yàn)橹羔樢彩亲兞浚热皇亲兞?,那他也肯定有地址,有地址,所以也可以被保存起?lái),保存一級(jí)指針地址的空間,就是二級(jí)指針。
其關(guān)系表示
指針總結(jié)基礎(chǔ)

數(shù)組與指針:

兩者本質(zhì)上沒(méi)有什么關(guān)系!
數(shù)組名與數(shù)組地址及數(shù)組首元素的關(guān)系:數(shù)組地址與數(shù)組首元素地址在數(shù)值上相等。但意義上不同。(數(shù)組地址加一加過(guò)了整個(gè)數(shù)組,而首元素地址加一只加過(guò)了一個(gè)元素)
數(shù)組名在取地址符號(hào)后,及在sizeof中單獨(dú)使用時(shí)代表整個(gè)數(shù)組,剩下的情景都表示數(shù)組中首元素地址。
數(shù)組表示中 數(shù)組名稱【元素下標(biāo)】=*(數(shù)組名稱+元素下標(biāo)) 此處的數(shù)組名稱表示首元素地址。

個(gè)人心得:指針就是一個(gè)存放地址的變量,二級(jí)指針也是個(gè)變量,三級(jí)四級(jí)都是,所以不要總把指針看作個(gè)例。
數(shù)組和指針沒(méi)有什么關(guān)系,只是在某些表達(dá)形式上,有很多相同之處。

指針數(shù)組

一個(gè)數(shù)組,里面存放元素的類型都是某類型指針,數(shù)組內(nèi)每個(gè)空間都存放一個(gè)地址,指向某內(nèi)存空間。

int*  arr1[10];  //×××指針的數(shù)組
char* arr2[4]; //一級(jí)字符指針的數(shù)組
char** arr3[4];//二級(jí)字符指針的數(shù)組
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI