您好,登錄后才能下訂單哦!
最近在看《C語言深度剖析》,發(fā)現(xiàn)里面的東西還是挺有用的,特別是以前腦海中C語言中一些不清晰的部分作者都一一指出了,對與深入學(xué)習(xí)C和找工作方面都有幫助。
今天要記錄一些指針方面的東西,包括數(shù)組名和數(shù)組名的地址,指針數(shù)組和數(shù)組指針,函數(shù)指針的用法。
首先看一段代碼:
#include <stdio.h> int main() { int a[5]={0}; printf("sizeof(a):%d\nsizeof(&a):%d\nsizeof(&a[0]):%d\n",sizeof(a),sizeof(&a),sizeof(&a[0])); printf("a:0x%x\n&a:0x%x\n&a[0]:0x%x\n",a,&a,&a[0]); return 1; }
編譯運行結(jié)果:
感覺還是蠻意外的,因為 a 和&a[0]的值是完全一樣的,都是數(shù)組首元素的地址,而&a感覺其值應(yīng)當(dāng)是a的地址,運行結(jié)果卻是&a的值表示的也是數(shù)組首元素的地址。
有一句比較拗口的話,你對數(shù)組名取地址當(dāng)然取到的是數(shù)組的地址,而不幸的是c又規(guī)定數(shù)組名的值就是數(shù)組地址。
對于sizeof,首先它不是函數(shù),它是一個操作符(operator)簡單的說其作用就是返回一個對象或者類型所占的內(nèi)存字節(jié)數(shù)。
在很多筆試題中都會考到sizeof一個struct,需要注意內(nèi)存對其。
還有就是sizeof數(shù)組名了,要注意數(shù)組名在sizeof的時候不退化為指針,所以sizeof的是整個數(shù)組的大小,5*4 = 20;
還要注意的是當(dāng)數(shù)組名作為函數(shù)的參數(shù)進行傳遞的時候,數(shù)組就自動退化為同類型的指針。
首先看下面兩句:
int *p1[10]; int (*p2)[10];
第一個,[ ] 的優(yōu)先級比 * 的優(yōu)先級大,所以是申明一個數(shù)組,這個數(shù)組的數(shù)據(jù)類型是 int *,其含有10個指向int類型數(shù)據(jù)的指針,所以這是一個指針數(shù)組。
第二個,括號優(yōu)先級最大,所以是定義一個指針,指針指向的內(nèi)容是包含10個元素的數(shù)組,所以這是一個數(shù)組指針,注意,它是一個二級指針。
看一個例子:
#include <stdio.h> int main() { int *p1[10]; int (*p2)[10]; int a = 10; int b[2][10]={0}; p1[1] = &a; p2 = b; printf("*p1[1]:%d\np2[0][0]:%d\n",*p1[1],p2[0][0]); printf("%d,%d\n",sizeof(p1),sizeof(p2)); return 1; }
理解了指針數(shù)組和數(shù)組指針的改面,上面的代碼也就明了了。
函數(shù)指針的含義是一個指針變量,其指向的值是一個函數(shù),看下面一個例子。
#include <stdio.h> long factorial(int n) { long result = 1; while (n > 1) { result *= n; n--; } return result; } int main() { long (*pf)(int n) = factorial; long result1 = pf(10); long result2 = (*pf)(10); printf("%d\n",sizeof(pf)); printf("%ld,%ld\n",result1,result2); return 1; }
16行聲明定義了一個函數(shù)指針,指向factorial函數(shù),注意括號不能省略。
17和18行是調(diào)用函數(shù)指針的兩種方式,效果是一樣的。
19行打印函數(shù)指針占的內(nèi)存空間。
《C語言深度剖析》
C語言函數(shù)指針基礎(chǔ) - http://blog.jobbole.com/44639/
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。