關於C語言指針(通俗易懂,不間斷更新)

早就聽老前輩講指針是C語言的靈魂,指針就是這麼個神奇的東西,當你以爲自己指針掌握的還不錯的時候,下一秒可能就被它的一個變形難住,最近在看一本Kenneth A.Reek寫的《C與指針》,感嘆以前對指針的理解還是太過膚淺,以下是我的一些小總結。

在我看來,理解一個指針無非是要知道三個問題

①我是誰

②我在哪

③我指向誰

 

舉個例子,假如:

char p='a'                        //假設聲明瞭p後,p在內存的0x01處,則&p=0x01(&爲取變量首地址)

char * p1=&p                  //則p1= 0x01,*p1=p=' a',p1就和p關聯了;假設p1被放在0xa1處

char ** p2=&p1              //則p2= 0xa1,*p2=p1=&p= 0x01,**p2=&p1=p='a'

 

【一】

①const char *ptr: 不能用ptr來修改所指向的內容

②char const *ptr: 效果同①

③char *const ptr: 不能修改ptr所存放的地址值

 

【二】

char str[] = "hello";

char *p = str;

p[i]中存放的是變量,

p+i 是一個指針,

所以p[i] =*(p+i)      p+i中存放的是p[i]的地址

 

【三】

一維數組

int num[5] = {1,2,3,4,5};

int *ap = num + 2;                      ap --------> num[2](第三個元素)

對等表達式,表格中每一行表示的意義相同

 

printf("%d",*((int*)(&num+1)-1));    打印結果:5

&num+1:指向下一行的行首(當然此處不存在)

(int*)(&num+1)-1:向前移一個int大小,即指向元素5的地址
 

num[subscript]   等價於   *(array + (subscript)),subscript可以是一個數,也可以是一個求值表達式

 

【四】

二維數組

int a[2][3] = {1,2,3,4,5,6};

 

*(*(a+1)+1)相當於a[1][1];

分析:

*(a+1) 等價  a[1]  等價 &a[1][0]

故*(a+1)+1相當於&a[1][1]

 

不同於一維數組,這裏a並不是一個指向整型的指針,而是一個指向整數數組的指針

可以把二維數組看成一維數組,int a[2][3] <------>int xxx[] = {★1,★2,★3}

只是這個一維數組每一個元素★都是一個入口地址,★2表示一維數組{ a[1][0],a[1][1],a[1][2] }的入口地址,即★2 = &a[1][0]

 

 

 

 

 

關於二維數組指針表示,C語言指針引用二維數組詳解

http://c.biancheng.net/view/227.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章