內容接上一篇,以下是答案:
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. 總結一下數組和指針的區別與聯系
區別:
指針 | 數組 |
間接訪問數據 | 直接訪問數據 |
保存地址 | 保存數據 |
動態的數據結構 | 存固定數目且相同類型的元素 |
malloc(), free() | 隱式分配機制 |
指向匿名數據 | 自身即數據 |
聯系:
1. 表達式中數組名被編譯器當做一個指向該數組的第一個元素的指針 |
2. 下標總是與指針的偏移量一致 |
3. 在函數參數中,數組名被編譯器當做指向該數組的第一個元素的指針 |
4. 在多維數組中,雖然與多級指針有着不同,但是在編譯器中,還是被看成多級指針的形式。 |
就說到這里吧!這一篇寫了好長的時間,寫的不好,請各位大牛指正。多謝了!
參考文獻
1. 《C語言程序設計》
2. 《C和指針》
3. 《C專家編程》
4. http://baike.baidu.com/view/2072881.htm;百度百科中的指針數組的部分知識。