首頁>技術>

問題一:結果是a[2] = 7是哪幾條語句

int a[3]={2,5,7};printf("a[2] = %d\n", a[2]);printf("a[2] = %d\n", *(a+2));printf("a[2] = %d\n", *(&a+2));printf("a[2] = %d\n", *(&a[1]+1));printf("a[2] = %d\n", *(&a[0]+2));

問題二:

哪一句編譯器會爆警告:型別不匹配

warning: assignment from incompatible pointer type

int *p;int a[3]={2,5,7};P = a;    p = &a;	p = &a[0];  

a , a[0], &a, &a[0],理解這些符號的時候要和左值右值結合起來,也就是搞清楚每個符號分別做左值和右值時的不同含義。

1、a,表示陣列名

a做左值時表示整個陣列的所有空間(10×4=40位元組)【又因為C語言規定陣列操作時要獨立單個操作,不能整體運算元組,N 所以a不能做左值】; a做右值表示陣列首元素的首地址 (首元素首地址就是陣列的第0個元素的起始地址,也就是a[0]的起始地址)

2、a[0],表示陣列的首元素,也就是陣列的第0個元素。

a[0]做左值時表示陣列第0個元素對應的記憶體空間(連續4位元組); a[0]做右值時表示陣列第0個元素的值(也就是陣列第0個元素對應的記憶體空間中儲存的那個數)

3、&a,表示陣列名a取地址,字面意思是陣列的地址(陣列的地址就是陣列的首地址(也叫陣列的起始地址))

&a不能做左值(&a實質是一個常量,不是變數因此不能賦值,所以自然不能做左值。); &a做右值時表示【整個陣列的首地址】

4、&a[0],字面意思就是陣列第0個元素的首地址(搞清楚[]和&的優先順序,[]的優先順序要高於&,所以a先和[]結合再取地址)。 &a[0] 做左值時表示【陣列首元素首地址所對應的記憶體空間】 &a[0] 做右值時等同於a。表示陣列首元素的首地址

問題一:

指標格式訪問陣列元素是:*(指標+偏移量); 如果指標是陣列首元素地址(a或者&a[0]),那麼偏移量就是下標;指標參與運算的特點是,指標變數+1,並不是真的加1,而是加1*sizeof(指標指向的資料

型別);如果是int *指標,則+1就實際表示地址+4位元組,如果是char *指標,則+1就表示地址+1位元組;如果是double *指標,則+1就表示地址+8位元組.

所以*(&a+2)是一個野指標,值是隨機的。a[2]=1095666312

&a是整個陣列的首地址,而a是陣列首元素的首地址。這兩個在數字上是相等的,但是意義不相同。意義不相同會導致他們在參與運算的時候有不同的表現。

問題二:p = &a;型別不匹配的原因

p是int * (指向int型別的指標),而&a是int (*)[3] (指向int陣列的指標,也即指向整個陣列的首地址)

13
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 成為資料分析師必會的資料視覺化種類