轉 對於C語言中指標和陣列的認識和看法

2022-03-07 03:39:47 字數 2760 閱讀 6265

[紅字之間部分---對我自己的指引]

最重要的最具啟發性的部分:指標和陣列

對經典話語的摘抄在此:

對於陣列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...