C語(yǔ)言 指針入門(mén) 看這一篇就夠了

本篇文章是從 指針的運(yùn)算開(kāi)始講的 螃成,可能對(duì)完全沒(méi)基礎(chǔ)的同學(xué)不太友好

建議從這一篇文章開(kāi)始閱讀

?[C語(yǔ)言必知必會(huì)] 指針

指針的運(yùn)算 詳解 [C語(yǔ)言必知必會(huì)]

指針的運(yùn)算

指針加減 常量

請(qǐng)看下面的程序祷嘶,猜測(cè)一下結(jié)果:

int main() {

    int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int* a = &arr;

    printf("a     = %p\n", a);
    printf("a + 1 = %p\n", a + 1);
    printf("a - 1 = %p\n", a - 1);

}

運(yùn)行結(jié)果:

a     = 00AFF82C
a + 1 = 00AFF830
a - 1 = 00AFF828

可以看到锭亏, a 與 a + 1 和 a - 1 都差了四個(gè)字節(jié)

指針加減常量 加減的大小為 sizeof(類(lèi)型) * 常量

再試試 char 類(lèi)型杈绸?

int main() {

    char arr[10] = { ' 1', '2', '3', '4', '5', '6', '7', '8', '9', '10',};
    char* a = &arr;

    printf("a     = %p\n", a);
    printf("a + 1 = %p\n", a + 1);
    printf("a - 1 = %p\n", a - 1);

}

結(jié)果如我們所料:

a     = 0095F9E0
a + 1 = 0095F9E1
a - 1 = 0095F9DF

相差大小 為 1

指針 - 指針

先來(lái)看一段程序吧:

int main() {

    char arr1[10] = { ' 1', '2', '3', '4', '5', '6', '7', '8', '9', '10', };
    int  arr2[5] = { 1, 2, 3, 4, 5 };

    char* ch1 = &arr1[4];
    char* ch2 = &arr1;
    int* i1 = &arr2[4];
    int* i2 = &arr2;

    printf("ch1 - ch2 = %d\n", ch1 - ch2);
    printf("ch2 - ch1 = %d\n", ch2 - ch1);
    printf("\ni1 - i2 = %d\n", i1 - i2);
    printf("i2 - i1 = %d\n", i2 - i1);

}

指針相減 結(jié)果會(huì)是 指針相差的大小嗎?看結(jié)果:

ch1 - ch2 = 4
ch2 - ch1 = -4

i1 - i2 = 4
i2 - i1 = -4

指針 減 指針 意義是 兩個(gè)地址之間相隔的單元格數(shù)
也可以理解為:指針相差的大小 / sizeof(類(lèi)型)

如果想輸出兩個(gè)指針 相差的距離(大械乖础)只需要將變量類(lèi)型 更改成普通類(lèi)型隶症,如下:

int main() {

    char arr1[10] = { ' 1', '2', '3', '4', '5', '6', '7', '8', '9', '10', };
    int  arr2[5] = { 1, 2, 3, 4, 5 };

    //變量不再是指針變量
    char ch1 = &arr1[4];
    char ch2 = &arr1;
    int i1 = &arr2[4];
    int i2 = &arr2;

    printf("ch1 - ch2 = %d\n", ch1 - ch2);
    printf("ch2 - ch1 = %d\n", ch2 - ch1);
    printf("\n");
    printf("i1 - i2 = %d\n", i1 - i2);
    printf("i2 - i1 = %d\n", i2 - i1);

}

輸出結(jié)果:

ch1 - ch2 = 4
ch2 - ch1 = -4

i1 - i2 = 16
i2 - i1 = -16

普通類(lèi)型是無(wú)法進(jìn)行解引用操作的

總結(jié)一下

指針 可以 加減常數(shù),指針之間可以相減呐粘,可以比較(如:> == < >=等)
但是指針不能乘除满俗,相加 這是沒(méi)有意義的
舉個(gè)很簡(jiǎn)單的例子,時(shí)間可以相減事哭,但是時(shí)間乘除或者相加有什么意義呢漫雷?

NULL

通過(guò)前面的學(xué)習(xí)瓜富,我們知道:內(nèi)存中的地址有很多編號(hào)鳍咱。如果你的機(jī)器是 32 位,
那么內(nèi)存范圍是:0 ~ 2^32 -1(32位2進(jìn)制數(shù)全1) 最大值大約為 4GB
NULL其實(shí)就表示 0地址
補(bǔ)充個(gè)小知識(shí)點(diǎn):
1kB=1024B =2^10(次方是二進(jìn)制形式)
1MB=1024kB =2^20
1GB=1024MB =2^30
1TB=1024GB =2^40

NULL有什么用?

0地址規(guī)定為我們不能寫(xiě)入的地址,你的指針不指向 0地址织中,如果你的指針指向了 0地址 那么程序運(yùn)行時(shí)會(huì)崩潰抗悍。基于這個(gè)特點(diǎn)串述,0地址 也就是NULL有了很重要的功能:

NULL類(lèi)型時(shí) void * 可以設(shè)置任何類(lèi)型為NULL
下面的程序是官網(wǎng)上講NULL時(shí)給出的例子:

#include <stdlib.h>
#include <stdio.h>
int main(void)
{
    // 能設(shè)置任何類(lèi)型指針為 NULL
    int* p = NULL;
    struct S* s = NULL;
    void(*f)(int, double) = NULL;

    // 多數(shù)返回指針的函數(shù)用空指針指示錯(cuò)誤
    char* ptr = malloc(10);
    if (ptr == NULL) printf("Out of memory");
    free(ptr);
}

void*

void* 表示 不知道指向什么類(lèi)型的 指針
比如:

int i = 1;
int* p = &i;
void* q = (void*)p;

這么寫(xiě)并沒(méi)有改變 p 所指向的變量的類(lèi)型推正, 而是可以讓程序用不同的眼光通過(guò) p看它所指的變量。

指針類(lèi)型的作用

1. 指針的類(lèi)型決定了指針向前或者向后走一步有多大
2. 指針的類(lèi)型決定了宝惰,對(duì)指針解引用的時(shí)候有多大的權(quán)限(能操作幾個(gè)字節(jié))

(具體示例參考 C語(yǔ)言復(fù)習(xí)鞏固(五) 指針(初階))


更多關(guān)于指針的可以參考我的其他篇文章:

CSDN-專(zhuān)業(yè)IT技術(shù)社區(qū)-登錄

?[C語(yǔ)言必知必會(huì)] 指針

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末植榕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子尼夺,更是在濱河造成了極大的恐慌尊残,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淤堵,死亡現(xiàn)場(chǎng)離奇詭異寝衫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拐邪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)慰毅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人庙睡,你說(shuō)我怎么就攤上這事事富〖祭” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵统台,是天一觀(guān)的道長(zhǎng)雕擂。 經(jīng)常有香客問(wèn)我,道長(zhǎng)贱勃,這世上最難降的妖魔是什么井赌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮贵扰,結(jié)果婚禮上仇穗,老公的妹妹穿的比我還像新娘。我一直安慰自己戚绕,他們只是感情好纹坐,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著舞丛,像睡著了一般耘子。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上球切,一...
    開(kāi)封第一講書(shū)人閱讀 52,246評(píng)論 1 308
  • 那天谷誓,我揣著相機(jī)與錄音,去河邊找鬼吨凑。 笑死捍歪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鸵钝。 我是一名探鬼主播糙臼,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蒋伦!你這毒婦竟也來(lái)了弓摘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤痕届,失蹤者是張志新(化名)和其女友劉穎韧献,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體研叫,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锤窑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嚷炉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渊啰。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绘证,到底是詐尸還是另有隱情隧膏,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布嚷那,位于F島的核電站胞枕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏魏宽。R本人自食惡果不足惜腐泻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望队询。 院中可真熱鬧派桩,春花似錦、人聲如沸蚌斩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凳寺。三九已至鸭津,卻和暖如春彤侍,著一層夾襖步出監(jiān)牢的瞬間肠缨,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工盏阶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晒奕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓名斟,卻偏偏與公主長(zhǎng)得像脑慧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砰盐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容