第六節陣列與指標

2022-10-15 14:24:06 字數 3885 閱讀 4579

1.1 陣列、陣列元素、指標的大小

1. 如程式清單6. 1所示,程式輸出什麼?

程式清單6.1陣列、陣列元素、指標的大小

#include <>

int main(int argc, char *ar**)

p是指標,任何資料型別的指標都是佔4位元組;

*p是乙個指標指向的int資料,int型資料占用4位元組;

a是陣列,除了sizeof(a)和&a之外,當a出現在表示式中時,編譯器會將a生成乙個指向a[0]的指標,而這裡測量的是整個陣列的大小。

答案:sizeof(p) = 4

sizeof(*p) = 4

sizeof(a) = 400

sizeof(a[100]) = 4

sizeof(&a) = 4

sizeof(&a[0]) = 4

請按任意鍵繼續. . .

1.2 廣東省的省**和廣州市的市**都在廣州

1. 如程式清單6. 2所示,如果ptr = 0x1000 0000,那麼剩下三個輸出是多少?

程式清單6.2陣列首位址與陣列首元素位址

intiarray[3] = ;

int*ptr = iarray ;

printf("ptr = %#x\n", ptr ) ;

printf("iarray = %#x\n", iarray ) ;

printf("&iarray = %#x\n", &iarray ) ;

printf("&iarray[0] = %#x\n", &iarray[0] ) ;

iarray是陣列名,由6.1節對a的說明,可iarray知同時也是陣列首元素的位址,為0x1000 0000;&iarray是陣列的首位址,這是毫無疑問的。&iarray[0]是陣列首元素的位址,也是0x1000 0000。

也就是說陣列的首位址和陣列首元素的位址是相等的。因為廣東省的省**和廣東省的首號城市廣州市的市**都在廣州,兩者的位址是相等的。如圖6.

1所示。

如程式清單6. 3所示,ptr = 0x1000 0000 ,那麼這三個輸出會是多少?

程式清單9.3陣列首位址加1、陣列首元素位址加1

intiarray[3] = ;

int*ptr = iarray ;

printf("&iarray+1 = %#x\n", &iarray+1 ) ;

printf("iarray+1 = %#x\n", iarray+1 ) ;

printf("&iarray[0]+1 = %#x\n", &iarray[0]+1 ) ;

答案是,第乙個輸出:0x1000 000c;第二個、第三個輸出:0x1000 0004。

&iarray是陣列的首位址,那麼&iarray+1是偏移乙個陣列單元,因為站在全國的角度報全國各省**的天氣預報,報完廣東省省**之後就為湖南省省**;如圖6. 1所示。&iarray[0]是陣列首元素的位址,&iarray[0]+1是偏移乙個陣列元素單元,好比站在廣東的角度報廣東各城市的天氣預報,報完廣東省首號城市廣州的天氣預報之後就是為廣東省第二號城市的天氣預報。

1.3 陣列作為函式引數,是傳什麼進去了

1. 如程式清單6. 4所示,程式輸出什麼?

程式清單6.4陣列作為函式引數

voidtext(charcarray)

intmain(intargc,char* ar**)

這裡考查兩個知識點,其一,sizeof和strlen();其二text(char carray)形參到底是什麼?

答案是7,4。看到答案我想大家就應該明白上面兩個問題了吧。到底是傳值還是傳址一定要搞明白哦。

1.4 指標相減

1. 如程式清單6. 5程式,輸出會是什麼?

程式清單6.5指標相減

#include <>

int main(int argc, char *ar**)

; int*p = a ;

int*q = p + 1 ;

printf( "q - p = %d \n" , q-p ) ;

printf( "(int)q - (int)p = %d \n" , (int)q-(int)p ) ;

return 0;

}用數學方法到可以做出q-p = 1這個答案,但是(int)q - (int)p 的答案。指標,指標的強大。由於指標加1,記憶體位址是加sizeof(int),但是int(q)和int(p)就不再是指標,而是乙個整形資料。

所以(int)q - (int)p= 4 。

1.5 指標加1到底是加什麼

1. 如程式清單6. 6所示,請問p1+5=__;p2+5=__;

程式清單6.6指標加1

#include <>

int main(int argc, char *ar**)

由於p + n = p + n * sizeof(p的資料型別) ,所以答案為:

p1+5 = 0x801005

p2+5 = 0x810014

請按任意鍵繼續. . .

1.6 陣列與指標的概念

1. 如程式清單6. 7所示,解釋程式。

程式清單6.7陣列與指標的概念

a) int a;

b) int *a;

c) int **a;

d) int a[10];

e) int *a[10];

f) int (*a)[10];

g) int (*a)(int);

h) int (*a[10])(int);

答案:a) 乙個整型數 ;

b) 乙個指向整型數的指標;

c) 乙個指向指標的指標,它指向的指標是指向乙個整型數;

d) 乙個有10個整型數的陣列;

e) 乙個有10個指標的陣列,該指標是指向乙個整型數的;

f) 乙個指向有10個整型數陣列的指標;

g) 乙個指向函式的指標,該函式有乙個整型引數並返回乙個整型數;

h) 乙個有10個指標的陣列,該指標指向乙個函式,該函式有乙個整型引數並返回乙個整型數。

這個題目很經典,很多公司的筆試題目都會擷取上面部分出來考試。特別是e和f,哪乙個是陣列指標,哪乙個又是指標陣列;g和h哪乙個是函式指標,哪乙個又是指標函式。

1.7 陣列與指標的糅合

1. 如程式清單6. 8所示,輸出會是什麼?

程式清單6.8陣列與指標的糅合應用1

int arr =;

int *ptr =arr;

*(ptr++) +=123;

printf("%d,%d",*ptr,*(++ptr));

這個題目**於華為的一道c語言筆試題,答案是:8,8。*ptr = arr ,這裡ptr取得是陣列arr的首元素位址,*(ptr++) +=123 ,這裡是ptr++,此時*(ptr)即為:

6,那麼*(prt++)+123=129,執行完*(ptr++)+=123之後,*(ptr) = 7。跟*(++ptr)之後為8這個值是沒有半點關係,由於執行了*(++ptr),所以此刻的*(ptr)為8,所以輸出為:8,8。

2. 如程式清單6. 9所示,輸出會是什麼?

程式清單6.9陣列與指標的糅合應用2

int main( int argc , char *ar** )

; int *ptr = (int *)( &a + 1 );

printf( "%d,%d" , *(a+1) , *(ptr-1) );

}這個題目要求對指標的理解要比較透徹。由於*(a+1)和a[1]是等效的,則*(a+1)=a[1] = 2 。&a指的是指向整個陣列變數的指標,&a+1不是首位址+1,系統會認為加了乙個a陣列的偏移量,即偏移了乙個陣列的大小,因此ptr指向的是a[5],即是*(ptr+5),既然如此,那麼*(ptr-1)當然就是a[4] = 5咯。

所以這個題目的答案是: 2 , 5 。

第六單元第六節

課題教學內容 式與方程 2 教材82 83頁內容。練習十六9 14題。第六節1.進一步認識用字母表示數的意義及其作用,能正確地用含有字母的式子表示 數量及數量關係 計算公式等。2.掌握解方程的方法及列方程解決問題的步驟,解決問題的關鍵是找出數量之 教學目標 間的相等關係,能根據題意正確地列出方程,解...

第六章第六節第六節直接證明與間接證明

課時提公升作業 四十 一 選擇題 1.在證明命題 對於任意角 cos4 sin4 cos2 的過程 cos4 sin4 cos2 sin2 cos2 sin2 cos2 sin2 cos2 中應用了 a 分析法 b 綜合法 c 分析法和綜合法綜合使用 d 間接證法 2.要證明a2 b2 1 a2b2...

第六節薪酬體系制度

薪酬作為分配價值形式之一,遵循按勞分配 效率優先 兼顧公平及可持續發展的原則。薪酬分配的依據是 貢獻 能力和責任。第二條享受年薪制的員工,其工作特徵是以年度為週期對經營工作業績進行評估並發放相應的薪酬。這部分員工包括管理職系中的總經理。第三條實行等級工資制的員工是公司內從事例行工作且非銷售業務的員工...