二级指针和二维数组
c語言中的指針我相信很多人都被整懵b過,尤其二級指針和二維數(shù)組那塊根本不知道指向的是哪些值,我最近也是學了這些個二維數(shù)組和二級指針的關系,也就是懂點皮毛,順便加深一下這方面的知識來淺談一下,如有錯誤,必定虛心求教!
首先一級指針和一維數(shù)組的關系:
?
#include<stdio.h>
int main()
{int ar[3] = {1,2,3};int* arp = ar;return 0;
}
vs中調(diào)出監(jiān)視窗口
va
一維數(shù)組的數(shù)組名代表的是數(shù)組首元素的地址?
還需要注意的一個點就是說指針中*(arp+1) = *arp+1? 這是因為地址常量可以退化成對應的指針
當然你也可以查出數(shù)組中其他值的地址
相鄰兩數(shù)值之間相隔4,這是由于類型是int型的,
int 型指針+1:地址+4
short型指針+1:地址+2
char型指針+1:地址+1
二維數(shù)組與二級指針
顧名思義就是若干個一維數(shù)組組合到一起。
#include<stdio.h>
int main()
{int ar[3][3] = { 1,2,3,4,5,6,7,8,9 };int (*arp)[3] = &ar;return 0;
}
vs調(diào)出監(jiān)視窗口
?
?
?
?這個中相當于什么東西呢,和一維指針一樣數(shù)組名等于首元素的地址,但是二維數(shù)組中的首元素是ar[0]這一行的數(shù)組,所以二維數(shù)組ar這個數(shù)組名代表ar[0]這一行數(shù)組的首地址。
關于二維數(shù)組指針代碼的書寫
#include<stdio.h>
int main()
{int ar[3][3] = { 1,2,3,4,5,6,7,8,9 };int *(arp)[3] = ar; return 0;
}
以上代碼塊為正確的代碼塊,而錯誤的代碼塊這樣寫:
#include<stdio.h>
int main()
{int ar[3][3] = { 1,2,3,4,5,6,7,8,9 };int *arp = ar; //因為ar是二維數(shù)組,二維數(shù)組首地址是一個數(shù)組,所以必須寫成*(arp)[3]return 0; //該代碼為錯誤代碼
}
#include<stdio.h>
int main()
{int br[3] = {1,2,3};int *s = br; //數(shù)組名相當于數(shù)組首地址int (*sbr)[3] = &br; //首地址取地址int ar[3][3] = { 1,2,3,4,5,6,7,8,9 };int (*p)[3] = ar;int (*arp)[3][3] = &ar; //首地址取地址return 0;
}
上面說到的首地址取地址結(jié)果如下(如果顯示的不是下圖這種格式的胡,右鍵數(shù)據(jù)以16進制打開即可)
?最后再拿出我們老師的一道例題
#include<stdio.h>
int main()
{int ar[5][2]= { 1,2,3,4,5,6,7,8,9,10 } ;int(*p)[2] = &ar[1];int* s = ar[1];printf ("%d \n", p[1][3]);printf ("%d \n", s[3]) ;return 0;
}
int(*p)[2] = &ar[1]; //對它進行解引用 int(*p)[2] = &*(ar+1); //然后&和*相互抵消 即為ar+1 //其中int(*p)[2]的意思為無論這個二維數(shù)組有幾行,它有兩列 //然后數(shù)組是ar[5][2] = {1,2,3,4,5,6,7,8,9,10} ar+1即為加到第二行數(shù)組的首地址//然后p[1][3] ----> *(p[1]+3) ------> *(*(p+1)+3) 即為指向數(shù)字8的首地址 則打印出來為8//int *s = ar[1] 直接就是int s = *(ar + 1) 則s指向首地址為3的數(shù)組 //然后s[3] = *(s+3) 則s[3]的值為3向前加三個元素,為6
對了:
**a相當于a[][]、也相當于*a[]
*(*(a[+1])+2)相當于a[1][2]
指針其實就是內(nèi)存地址、*a就是內(nèi)存地址的數(shù)據(jù)
而數(shù)組名就是數(shù)組的首地址
[doge]!
總結(jié)
- 上一篇: 加拿大留学机票多少钱?
- 下一篇: 支付宝到期了 要怎么办?