問題一:結果是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陣列的指標,也即指向整個陣列的首地址)