C語言入門(二)

1抡锈、多級指針

int main() {
    // 指針是用來記錄內(nèi)存地址的,但它本身也有內(nèi)存地址乔外。
    int i = 1000;
    int *ip = &i; // 取出i的內(nèi)存地址ip床三。
    printf("i的值是%d,內(nèi)存地址是%p\n", i, ip);

    int **ipp = &ip; // 取出內(nèi)存地址ip的內(nèi)存地址ipp杨幼。
    printf("i的內(nèi)存地址的值是%p勿璃,內(nèi)存地址的內(nèi)存地址是%p\n", ip, ipp);
  
    int ***ippp = &ipp; // 取出內(nèi)存地址ip的內(nèi)存地址ipp的內(nèi)存地址ippp。
    printf("i的內(nèi)存地址的內(nèi)存地址的值是%p,內(nèi)存地址的內(nèi)存地址的內(nèi)存地址是%p\n", ipp, ippp);

    // int ****ippp = &ippp; // 報錯补疑,最多三級指針

    int ippp_value = *ippp;
    int ipp_value = **ippp;
    int ip_value = ***ippp;
    printf("ippp_value值是%p歧沪,ipp_value值是%p,ip_value值是%d\n", ippp_value, ipp_value, ip_value);
}

打印結(jié)果:

i的值是1000莲组,內(nèi)存地址是0x7ff7b0c9443c
i的內(nèi)存地址的值是0x7ff7b0c9443c诊胞,內(nèi)存地址的內(nèi)存地址是0x7ff7b0c94430
i的內(nèi)存地址的內(nèi)存地址的值是0x7ff7b0c94430,內(nèi)存地址的內(nèi)存地址的內(nèi)存地址是0x7ff7b0c94428
ippp_value值是0xb0c94430锹杈,ipp_value值是0xb0c9443c撵孤,ip_value值是1000

2、數(shù)組與數(shù)組指針

int main() {
    int intArray[] = {1, 2, 3, 4};
    for (int i = 0; i < sizeof(intArray) / sizeof(intArray[0]); ++i) {
        printf(" i=%d竭望,內(nèi)存地址是=%p\n", i, &intArray[i]); // 地址連續(xù)
    }

    // 數(shù)組本身就是它的內(nèi)存地址邪码,它內(nèi)存地址又是它第一個元素的內(nèi)存地址。
    printf("intArray=%p\n", intArray);
    printf("&intArray=%p\n", &intArray);
    printf("&intArray[0]=%p\n", &intArray[0]);
}

打印結(jié)果:

i=0咬清,內(nèi)存地址是=0x7ff7b3824420
i=1闭专,內(nèi)存地址是=0x7ff7b3824424
i=2,內(nèi)存地址是=0x7ff7b3824428
i=3旧烧,內(nèi)存地址是=0x7ff7b382442c
intArray=0x7ff7b3824420
&intArray=0x7ff7b3824420
&intArray[0]=0x7ff7b3824420

數(shù)組中的元素地址是連續(xù)的影钉,每次挪動4個字節(jié),因為是int數(shù)組掘剪。

int main() {
    int intArray[] = {1, 2, 3, 4};
  
    int *intArray_p = intArray;
    printf("從intArray_p地址中取值%d\n", *intArray_p); // 只能取到第一個元素的值
    
    // 那想獲取到第二個元素的值呢平委,就要指針挪動
    printf("從intArray_p地址中取出第二個元素的值%d\n", *++intArray_p); // 取第二個元素的值
    
    // 如果想要取第四個元素。因為現(xiàn)在數(shù)組指針指向第二個元素夺谁,需要再往后移2位
    intArray_p += 2;
    printf("從intArray_p地址中取出第二個元素的值%d\n", *intArray_p); // 取第四個元素的值

    // 將指針重新回到1
    intArray_p -= 3;
    printf("將指針重新回到1廉赔,value=%d\n", *intArray_p);
}

3、采用指針遍歷數(shù)組

int main() {
    int intArray[] = {1, 2, 3, 4};
    for (int i = 0; i < sizeof(intArray) / sizeof(intArray[0]); ++i) {
        printf("第%d元素的值是%d匾鸥,內(nèi)存地址是%p\n", i, *(intArray + i), intArray + i);
    }
}

打印結(jié)果:

第0元素的值是1昂勉,內(nèi)存地址是0x7ff7b5415420
第1元素的值是2,內(nèi)存地址是0x7ff7b5415424
第2元素的值是3扫腺,內(nèi)存地址是0x7ff7b5415428
第3元素的值是4,內(nèi)存地址是0x7ff7b541542c

根據(jù)內(nèi)存地址村象,依次輸出元素的值笆环。可以看出內(nèi)存地址是連續(xù)的厚者。間隔4個字節(jié)躁劣,一個int值占四個字節(jié)

4、循環(huán)時給數(shù)組賦值

int main() {
    int intArray[4]; // 定義數(shù)組库菲,長度4账忘,未賦值。
    int *intArrayP = intArray; // 將數(shù)組轉(zhuǎn)成指針。
    printf("intArray的內(nèi)存地址是%p鳖擒,默認(rèn)元素的值是%d\n", intArrayP, *intArrayP);
    
    for (int i = 0; i < sizeof(intArray) / sizeof(intArray[0]); ++i) {
        // 第一個元素地址是intArrayP溉浙,那第二、三蒋荚、四的地址戳稽,依次+1。
        // 第一個元素賦值1000期升,第二惊奇、三、四的值也依次+1播赁。
        *(intArrayP + i) = 1000 + i;
        printf("第%d個元素的值是%d\n", i,*(intArrayP + i));
    }
}

打印結(jié)果:

intArray的內(nèi)存地址是0x7ff7bda22420颂郎,默認(rèn)元素的值是-1113447360
第0個元素的值是1000,地址是0x7ff7bda22420
第1個元素的值是1001容为,地址是0x7ff7bda22424
第2個元素的值是1002乓序,地址是0x7ff7bda22428
第3個元素的值是1003,地址是0x7ff7bda2242c

地址連續(xù)舟奠,值依次增加1竭缝。

5、數(shù)組指針操作的幾種方式

int main() {
    int intArray[] = {1, 3, 5, 7};
    int *intArrayP = &intArray;
    for (int i = 0; i < sizeof(intArray) / sizeof(intArray[0]); ++i) {
        printf("地址是:%p沼瘫。第一種:值是%d抬纸,第二種:值是%d,第三種:值是%d\n", &intArray[i],intArrayP[i], intArray[i], *(intArrayP + i));
    }
}

打印結(jié)果:

地址是:0x7ff7b5240420耿戚。第一種:值是1湿故,第二種:值是1,第三種:值是1
地址是:0x7ff7b5240424膜蛔。第一種:值是3坛猪,第二種:值是3,第三種:值是3
地址是:0x7ff7b5240428皂股。第一種:值是5铃绒,第二種:值是5垃沦,第三種:值是5
地址是:0x7ff7b524042c。第一種:值是7,第二種:值是7峡谊,第三種:值是7

第一種:根據(jù)指針獲取值兑巾;

第二種:根據(jù)數(shù)組取值骡显;

第三種:根據(jù)內(nèi)存地址獲取值浇冰;

6、指針類型有何用洋魂?

不同類型的指針偏移量是不一樣的绷旗。char占1個字節(jié)喜鼓,short占2個字節(jié),int衔肢、float占4個字節(jié)庄岖,double、long膀懈、char *占8個字節(jié)

7顿锰、函數(shù)指針

// 監(jiān)聽回調(diào)的方法
void onClick(char* msg) {
    printf("%s\n", msg);
}

// 定義一個監(jiān)聽方法,具體實現(xiàn)在下面
void setOnclickListener(void (*clickCallback)(char*));

int mainT2_6() {
    // 第一種寫法启搂,直接將函數(shù)地址傳入硼控。函數(shù)本身就是地址。
    setOnclickListener(onClick);

    // 第二種寫法:和寫法三類似胳赌,但寫法二更標(biāo)準(zhǔn)牢撼。
    // 先定義一個call函數(shù),然后call函數(shù)的值修改成onClick()函數(shù)的值疑苫。再將call函數(shù)的地址作為參數(shù)傳入熏版。
    // 這樣做的好處是,避免修改onClick()函數(shù)導(dǎo)致全局改變
    void (*call)(char*);
    call = onClick;
    setOnclickListener(call);

    // 第三種寫法:第二種寫法的非標(biāo)注寫法捍掺,在某些編譯器上有可能報錯撼短。
    void (*call2)(char*) = onClick;
    setOnclickListener(call2);

    // 不寫參數(shù),這種簡寫好像也可以挺勿。
    void *call3 = onClick;
    setOnclickListener(call3);
}

void setOnclickListener(void (*clickCallback)(char*)) {
    // 某種情況下會進行回調(diào)
    clickCallback("我被點擊啦...");
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末曲横,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子不瓶,更是在濱河造成了極大的恐慌禾嫉,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚊丐,死亡現(xiàn)場離奇詭異熙参,居然都是意外死亡,警方通過查閱死者的電腦和手機麦备,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門孽椰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凛篙,你說我怎么就攤上這事黍匾。” “怎么了鞋诗?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長迈嘹。 經(jīng)常有香客問我削彬,道長全庸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任融痛,我火速辦了婚禮壶笼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘雁刷。我一直安慰自己覆劈,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布沛励。 她就那樣靜靜地躺著责语,像睡著了一般。 火紅的嫁衣襯著肌膚如雪目派。 梳的紋絲不亂的頭發(fā)上坤候,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音企蹭,去河邊找鬼白筹。 笑死,一個胖子當(dāng)著我的面吹牛谅摄,可吹牛的內(nèi)容都是我干的徒河。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼送漠,長吁一口氣:“原來是場噩夢啊……” “哼顽照!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起螺男,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤棒厘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后下隧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奢人,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年淆院,在試婚紗的時候發(fā)現(xiàn)自己被綠了何乎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡土辩,死狀恐怖支救,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拷淘,我是刑警寧澤各墨,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站启涯,受9級特大地震影響贬堵,放射性物質(zhì)發(fā)生泄漏恃轩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一黎做、第九天 我趴在偏房一處隱蔽的房頂上張望叉跛。 院中可真熱鬧,春花似錦蒸殿、人聲如沸筷厘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酥艳。三九已至,卻和暖如春楣铁,著一層夾襖步出監(jiān)牢的瞬間玖雁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工盖腕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赫冬,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓溃列,卻偏偏與公主長得像劲厌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子听隐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

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