[紅字之間部分---對我自己的指引]
最重要的最具啟發性的部分:指標和陣列。
對經典話語的摘抄在此:
對於陣列int a[5]; int b[3][6];
a是個const的type為array of 5 ints變數,
&a為取出array of 5 ints的首位址,但a的值在c中規定是陣列首位址,不要亂聯絡。
&a在進行運算的時候取出的是型別
array of ints的首位址,所以型別是pointer of array of ints.
a在進行運算的時候取出的是型別
int的首位址,所以型別是pointer of int.
*p-----第一步取出存在p中位址,判斷存在p中的當前的位址是指向的什麼型別的變數,用*操作符將對應型別的值取出。
比如*a取出即為1個int。
比如*b取出的型別是:array of 6 ints
sizeof()-----是乙個關鍵字,靜態的判斷該型別的大小。
比如sizeof(a)是靜態的判斷a為array of 5 ints型別,所以列印5*4=20。
sizeof(&a)是靜態的判斷&a,這個由運算得來的位址,是取得的array of 5 ints的位址,所以列印4。
如果傳遞a的值給函式作為引數,需要用int* p型別的變數。
如果傳遞&a的值給函式作為引數,需要用int (*p)[5]作為引數。
指標變數沒有那麼神秘,指標變數只是乙個普通變數
假設指標pi儲存的是q的位址。pi和q沒有任何直接的關係。只有*pi才和q有直接的關係。
c語言只有一種函式引數傳遞方式:按值傳遞
[紅字之間部分---對我自己的指引]
4. 指標與陣列
4.1 陣列名的型別
在c語言中,指標與陣列千絲萬縷的聯絡.看下面的例子:
int a[5];
int b[3][5];
int *pa1[5];
int (*pa2)[5];
那麼a,b,pa1,pa2的型別到底是什麼呢?
很多人將a的型別誤解成為一級指標,即const pointer to int,
而將b的型別誤解成為二級指標,即const pointer to the pointer to int;
a不是const pointer to int型別的,我們是可以從下面這個事實推出來的:
sizeof(a)跟sizeof(int*)是不同的.
只能說,a是array of 5 ints型別的
而b則是array of 3 arrays of 5 ints型別的
這裡之所以把pa1和pa2列出來,主要是給大家區別一下:
pa1是array of 5 int pointers型別的,
而pa2是pointer to array of 5 ints型別的
4.2 陣列名的運算
大家經常會遇到關於陣列名的運算問題,比如
int a[5]=;
int b[3][5]=, , };
printf("%d", *(a+2));
printf("%d, %d\n", **(b+2), *(*b+2));
在進行上面的運算時,有下面的似非而是的結論:
&a可以看作是pointer to array of 5 ints型別的
所以&a+1,這裡的「1」是指5*sizeof(int)
a是array of 5 ints型別的,但是a的值是什麼呢?a的值其實是乙個
pointer to int
*a的值則是乙個int,即a[0];
&b可以看作是pointer to array of 3 arrays of 5 ints型別的
所以&b+1,這裡的「1」是指3*5*sizeof(int)
b是array of 3 arrays of 5 ints型別的,但是b的值卻是乙個
pointer to array of 5 ints
*b是array of 5 ints型別的,但是*b的值卻是pointer to int型別的
**b的值則是int型別的,即b[0][0];
4.3 一種常見錯誤
int b[3][5];
int **p=b;
有些人誤認為p+1的值和b+1是相同的,其實不然
類似於t1 b1;
t2* b2=(t2*)(&b1); //t1,t2為兩種不同的型別
這樣的話,b2+1是按sizeof(t2)進行增加的
而&b1+1是按照sizeof(t1)進行增加的
指標進行型別轉換後,其運算跟他自身的型別有關,而與他指向的東東無關
C語言中指標和陣列
首先,明確乙個概念,指標是什麼,一旦提到這個老生常談且富有爭議性的話題,那真是1000個人有1000種看法。在國內的很多教材中,給出的定義一般就是 指標就是位址 從初步理解指標的角度來說,這種說法是最容易理解的,但是這種說法明顯有它的缺陷所在。指標就是位址 這種說法相當於 指標 字面值位址 或者說乙...
C語言中指標和陣列的區別
看 c專家程式設計 一書,看到陣列與指標並不相同一章,遂做了一段測試 include include int main void 輸出 可以看到這樣的輸出,結果很顯然 第乙個輸出的值,0028ff24,應該是符號表中p的位址。第二個值,00403000,是位址0028ff24中儲存的值,也就是指標p...
C語言中指標和陣列分析 上
事物的難度遠遠低於對事物的恐懼!這章我們來分析下指標和陣列,在前兩章我們談了陣列和指標,我們知道 陣列的本質 陣列是一段連續的記憶體空間 陣列的空間大小為sizeof array type array size 陣列名可看做指向陣列第乙個元素的常量指標 那麼我們來看乙個問題 對於乙個陣列 int a...