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

指針解析(二)(原)

編輯:關於C語言

 內容接上一篇http://www.BkJia.com/kf/201202/121314.html,以下是答案:

    1. &ch 代表什麼?

    答:變量ch的地址

    2. pch 代表什麼?

    答:pch是char類型指針,指向ch。

    3. &pch 代表什麼?

    答:指針變量的地址

    4. *pch 代表什麼?

    答:對指針變量pch進行解引用,間接訪問了ch的值。

    5. *pch + 1 代表什麼?

    答:間接訪問操作,取得的拷貝值加一,(*pch + 1)為‘b’。

    6. *(pch + 1)代表什麼?啊、

    答:訪問到了ch之後的下一個地址上的內容。

    7. ++pch 代表什麼?

    答:假設當為右值,那麼應該是先遞增,後傳地址。

    8. *++pch 代表什麼?

    答:假設當為右值,那麼應該是先遞增,後通過地址間接訪問。

    9. *pch++ 代表什麼?

    答:假設當為右值,那麼應該是先通過地址間接訪問,後遞增。

    10. ++*pch 代表什麼?

    答:對pch指向的值加一。可以看成這樣,++(*pch)。

    11. (*pch)++ 代表什麼?

    答:假設為右值,先將pch指向的值傳給左值,然後對拷貝回來的值進行遞增。

    12. ++*++pch 代表什麼?

     答: ++(*++pch)這樣的話就可以看的比較的清楚了。

    13. ++*pch++ 代表什麼?

     答: ++(*pch++)參考第九個問題即可。

    現在,該是將數據和指針的淵源的時候了。先看以下代碼:

int a[10];    // 定義了一個長度為10,int類型的數組int *pa;      // 定義了一個int類型的指針pa = a; or pa = &a[0];
    上面的代碼說明了這麼幾個事情:

    ① 數組名代表了本數組第一個元素的地址。

    ② 這個事情要用圖來表示:

 d3e711e1d6c63b2018f9e00855d3f17d

 

  以上這些小內容只是開胃菜,真正的大餐在後面會慢慢上來!!
1. 字符指針
    字符串常量是一個字符數組。如:”I Love You!“,字符數組以“\0“結尾。此時,數組表示字符串常量和字符指針表示就有極大的區別了:
char amessage[] = "I Love You!";    // 定義了一個數組
char *pmessage = "I Love You!";    // 定義了一個字符指針
它們的區別為:

 841577b841bece553461d0d41c72ca9a
 

這個圖看起來也好像沒有什麼比較大的區別,無非就是pmessage多了個箭頭。其實它們差別大了去了。amessage始終指向同一個儲存位置,可以修改字符串常量中的字母。而pmessage只是一個char類型的指針,其初值指向字符串的一個常量,如果你試圖修改字符串的內容時,結果就是沒有定義 。
2. 指針的運算
    當指針和一個整型量執行算術運算時,整數在執行加法運算前始終會調整合適的大小進行調整。
①. 算術運算
    指針 ± 整數
    這個對於數組和用malloc函數分配的內存都適用。 例如以下代碼:
#include <iostream>
 
int main()
{
    int values[5];
    int *vp;
    for(vp = values; vp != &values[5];)
    {
        *vp++ = 0;        // 指針在這裡執行了遞增和賦值
    }
   
    for(vp = values; vp != &values[5];)
    {
        std::cout << *vp++ << std::endl;
    }
 
    return 0;
   
}
    指針 -指針
    這個只有當兩個指針都指向了同一個數組之後,這種減法才有實質的意義。 例如以下的代碼:
#include <iostream>
 
int main()
{
    int values[5];
    int *vp;
    int *vp1;
    int *vp2;
 
    for(vp = values; vp < &values[5];)
    {
        *vp = 0;
        vp++;
    }
   
    vp1 = values;
    vp2 = &values[3];
    std::cout << (vp1 - vp2) << std::endl;    // 顯示為-3,ptr_diff類型
 
    return 0;
   
}
3. 指針數組,數組指針,多維數組
    何為指針數組?傳說中,數組元素全為指針的數組稱為指針數組。一維指針數組的定義形式為:“類型名 *數組標識符[數組長度]”。例如 :
char *ptr_array[10];    // 指針數組,含有10個char類型指針的數組
                          // *ptr_array[i]:指向第i個文本行的首字符
大概就是這樣子了:

 334cfdea65715ab29225b5d68a6a60fa

 

那麼指針數組和數組指針有什麼區別呢? 數組指針是指向數組首元素的地址的指針,其本質為指針;指針數組是數組元素為指針的數組,其本質為數組。兩者之間的區別就亮了吧。
    關於多維數組和指針數組:多維數組,以二維數組為例。
char ar[3][8] = {"we","are","chinese"};
char *parray[3] = {"we","are","chinese"};
大概也是這個樣子:

 fe7d5d6d8e0fa3249be38c5bb7307892

很顯而易見,多維數組和指針數組有著較大的區別 。對於二維數組而言:只要定義了一個二維數組,無論賦不賦值,系統都會給他分配相應空間,而且該空間一定是連續的。其每個元素表示一個字符。我們可以通過制定下標對其元素進行修改.
    對於指針數組而言:如char *parray[3]系統至少會分配3連續的空間用來存儲3元素,表示parray是一個3個元素的數組,每個元素是一個指向字符型數據的一個指針。
    在編譯器中,ar[3][8]被看成,*(*(ar + i) + j);將其看成指針形式。
4. 總結一下數組和指針的區別與聯系
區別:

 

指針 數組 間接訪問數據 直接訪問數據 保存地址 保存數據 動態的數據結構 存固定數目且相同類型的元素 malloc(), free() 隱式分配機制 指向匿名數據 自身即數據 聯系:
1. 表達式中數組名被編譯器當做一個指向該數組的第一個元素的指針 2. 下標總是與指針的偏移量一致 3. 在函數參數中,數組名被編譯器當做指向該數組的第一個元素的指針 4. 在多維數組中,雖然與多級指針有著不同,但是在編譯器中,還是被看成多級指針的形式。  

就說到這裡吧!這一篇寫了好長的時間,寫的不好,請各位大牛指正。多謝了!

摘自  雲端小飛象cg
 

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