程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言入門篇-05

C語言入門篇-05

編輯:關於C語言

好,不知不覺已經來到了第五小節了,其實我們的C基本已經討論了一大半了,只要你把指針的概念弄清楚了,你的C路就已經起步了,好吧,我們繼續來討論指針。我們還是先來加快一下指針的定義,我們給它下的定義 是 指針是變量,是用來記錄地址的變量,那麼如何取得一個有效的地址呢?比如我們有一個整數val,那麼我們可以通過 &(英文會讀嗎,愛木潑散德,哈哈,鍵盤上的特殊符號英文怎麼讀,這個任務嘛,交給讀者了哦,如果你不會,你需要掌握一下這個技能哦) 這個符號來取得val的首地址,還記得首地址這個概念吧,很好理解的哦。那麼& 取得的首地址其實是有類型的哦,就是變量的類型,如

你 val是char型的,那麼&val 得到的就是char * 類型,如果 val是整型的,那麼&val 得到的就是 int *,總之 type val = x; &val 取到的地址是 type * 的,這個對指針也是一樣的哦,意思是 如果 int * p = x; &p 取到的地址類型就是 int * * ,能理解吧,,反正我感覺應該不是很難理解。

其實這些東西在編譯的時候會給出提示的,如下圖

133121244.jpg


所以放心吧,系統會幫我們檢測地址類型的哦,那麼為了消除這種錯誤,我們可以使用強制類型轉換哦,也就是在 &val 前面 加上 (char *) ,進行類型強制轉換。很好理解不是嘛。。。


好了,我們現在知道如何獲取一個地址了,那麼當我們有一個地址之後,有什麼用嗎?答案是肯定有用的。這就要談到另一個運算符了,,叫 *(愛斯特銳斯克) 運算符,那麼它怎麼用呢?其實用法很簡單,就是在它後面跟上一個 地址,怎麼理解呢?我們來看下面的解釋

*地址A: 我們解釋過,地址是有類型的哦,那麼這個意思就是 在 地址A起始位置向後取 類型所占字節數 個字節,唉,我打字的時候已經感覺到這句說的挺繞,我語文學的不好,哈哈,你就忍忍吧,我來舉幾個例子你就明白了啊,,如果地址A是 int * 類型的,值是0X0012FF7C,那麼我們通過*地址A就把0X0012FF7C - 0X12FF7F 裡的值取到了,如果地址A是char * 類型的,值是0X0012FF7C,那麼我們通過*地址A就把0X0012FF7C這一個字節的數據取到了,不難吧,所以說嘛,當時再說類型這個概念的時候,我就說過它是灰常灰常重要的呢。因為我們後面會經常用到它。現在來討論一下前面留下的問題吧,如何判斷一個系統是小端模式還是大端模式呢?現在你是不是感覺已經非常簡單了呢?

#include <stdio.h>
int main()
{
    int val = 1;
    char FirstByteVal = *(char *)&val;
    if(FirstByteVal == 1)
        printf("小端模式\n");
    else if(FirstByteVal == 0)
        printf("大端模式\n");
    else
        printf("你把我難倒了哦\n");
    return 0;
}

這個例子可以看懂吧,我們的目的就是取第一個字節,根據它是0還是1 來進行判斷。這只是一種判斷方法哦, 還有許多方法呢,但是在工作中,項目經理一般是不管你用什麼方式的,但是他要的是結果,你必須把結果弄出來,哈哈。


記住*號後面是跟的 地址,如果我舉一個例子,你也能理解,你就真的理解了。

#include <stdio.h>
int main()
{
    int val = 12;
    int * p = &val;
    int ** pp = &p;
    int *** ppp = &pp;
    printf("%d\n%d\n%d\n%d\n",val,*p,**pp,***ppp);
    return 0;
}

這段代碼的結果是什麼,為什麼?你要推導出過程哦。

那麼我們來看下圖

135544675.jpg

還是我們的四大屬性哦,能理解吧,我們仔細觀察這張表,第一行是

變量 一級指針 二級指針 三級指針

然後我們再看val的首地址與p的值 ,p的首地址和pp的值 ,pp的首地址和ppp的值,會發現是相同的,必須相同哦。我們*ppp取到的pp的值,而它又是一個int ** 的地址,再*一次,也就是**ppp 就相當於*(*ppp) = *(*0X0012FF74)=*0X0012FF78 = 0X0012FF7C ,理解了嗎,我想你應該理解了,如果不理解也沒關系,你把前五篇文章多讀幾次,古人說的好呀,書讀萬遍,其義自現,我是深有體會呀,TCP/IP第一卷你們看過嗎,我看過,我看前幾遍那是一個暈呀,不過後來,越看越容易理解,越看越知道它在講什麼,的確是這樣的,相信我,絕對沒錯的。

好了,現在都已經知道指針是什麼了,多級指針你也知道了,是不是感覺它沒有什麼用呢,哈哈,有這種感覺太正常了。因為我們還不知道什麼叫函數呢。函數又是怎麼回事呢?當我們把它弄清楚後再來討論這個指針的用處,其實我們現在已經把理論知道掌握的很好了。許多工作多年的人 連指針是什麼都搞不懂呢,,唉,不想多說什麼了,哈哈,你懂的。

下一講,我們會詳細講一下棧這個東西。很邪惡的哦。大家一定要注意基礎的知識,因為基礎很重要。


本文出自 “千千阙歌” 博客,請務必保留此出處http://qianqianquege.blog.51cto.com/8004200/1304784

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved