早就聽老前輩講指針是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語言指針引用二維數組詳解