內容接上一篇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];
上面的代碼說明了這麼幾個事情:
① 數組名代表了本數組第一個元素的地址。
② 這個事情要用圖來表示:
以上這些小內容只是開胃菜,真正的大餐在後面會慢慢上來!!
1. 字符指針
字符串常量是一個字符數組。如:”I Love You!“,字符數組以“\0“結尾。此時,數組表示字符串常量和字符指針表示就有極大的區別了:
char amessage[] = "I Love You!"; // 定義了一個數組
char *pmessage = "I Love You!"; // 定義了一個字符指針
它們的區別為:
這個圖看起來也好像沒有什麼比較大的區別,無非就是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個文本行的首字符
大概就是這樣子了:
那麼指針數組和數組指針有什麼區別呢? 數組指針是指向數組首元素的地址的指針,其本質為指針;指針數組是數組元素為指針的數組,其本質為數組。兩者之間的區別就亮了吧。
關於多維數組和指針數組:多維數組,以二維數組為例。
char ar[3][8] = {"we","are","chinese"};
char *parray[3] = {"we","are","chinese"};
大概也是這個樣子:
很顯而易見,多維數組和指針數組有著較大的區別 。對於二維數組而言:只要定義了一個二維數組,無論賦不賦值,系統都會給他分配相應空間,而且該空間一定是連續的。其每個元素表示一個字符。我們可以通過制定下標對其元素進行修改.
對於指針數組而言:如char *parray[3]系統至少會分配3連續的空間用來存儲3元素,表示parray是一個3個元素的數組,每個元素是一個指向字符型數據的一個指針。
在編譯器中,ar[3][8]被看成,*(*(ar + i) + j);將其看成指針形式。
4. 總結一下數組和指針的區別與聯系
區別:
就說到這裡吧!這一篇寫了好長的時間,寫的不好,請各位大牛指正。多謝了!
摘自 雲端小飛象cg