C語言陣列的一些問題

2021-06-21 23:55:43 字數 2074 閱讀 5960

我們都知道,陣列名可以當成乙個指標,同樣的函式名也可以當成乙個函式指標,指向函式的入口位址。現在有乙個問題,陣列名這個指標指向的是什麼呢?如果對陣列名再取位址,得到的又是什麼呢?

我們來驗證這兩個問題。

輸入以下**:

#include "stdio.h"

int main()

; //int(*p)[3]=a;

printf("%d,%d,%d,%d,%d\n",*a,a,&a,&a[0],sizeof(a));

printf("%d,%d,%d\n",*(a+1),a+1,&a+1);

return 1;

}

可以得到執行結果是:

可以發現,a和&a還有&a[0]所代表的位址是一樣的。但是當我們去計算a+1所代表的位址和&a+1所代表的位址的時候。就會發現,他們所產生的位址增量是不一樣的。a=1產生的位址增量是4個位元組,也就是乙個int型元素的位元組。而&a+1所產生的位址增量是12,是整個陣列的位元組大小。由此可見,a是指向陣列的第乙個元素,其意義跟&a[0]是一樣的,而&a指向的是一整個陣列。所以可以這麼說,a是乙個指向整型的指標,而&a是乙個指向整型陣列型指標。

繼續將上述**擴充套件:

#include "stdio.h"

int main()

; int*p1=a;

int(*p2)[3]=&a;

printf("%d,%d,%d,%d,%d\n",*a,a,&a,&a[0],sizeof(a));

printf("%d,%d,%d\n",*(a+1),a+1,&a+1);

printf("%d,%d,%d,%d\n",*p1,p1,p1+1,*(p1+1));

printf("%d,%d,%d,%d,%d,%d\n",*p2,p2,p2+1,*(p2+1),**p2,**(p2+1));

return 1;

}

需要注意的是,我們將p1定義成乙個指向整型的指標,而剛好a也是乙個指向整型的指標,因為上面已經說過,a指的是陣列的第乙個元素的位址,所以它是指向整型元素的。所以可以進行int*p1=a;這樣的賦值。而int(*p2)[3]這個指標因為是乙個指向3維陣列的指標,所以不能進行

int(*p2)[3]=a;這樣的賦值,因為它們的型別是不匹配的。p2是指向陣列的指標,而a是指向整型元素(陣列的第乙個元素)的指標。所以只能用int(*p2)[3]=&a;這樣的賦值方式才是正確的。因為&a正是乙個指向陣列的指標。

我們的運算結果如下。

可以發現,p1+1的位元組移動了4個,而p2+1的位元組移動了12個。p1+1指向了陣列第二個元素2.而p2+1的位址則偏移了12個位元組。因為p2是指向陣列的指標。所以p2和*p2代表的值是一樣的,因為p2指向整個陣列的首位址,而*p2正好指向陣列的首元素的位址,這兩個位址在數值上是一樣的。同樣*(p2+1)和p2+1在陣列上也是一樣的。**p2即時首元素的值,但是**(p2+1)所指向的東西是不確定了,因為它已經調到了下乙個陣列了,而這個陣列可能是不存在的。

我們再將程式進行改進。

#include "stdio.h"

int main()

; int*p1=a;

int(*p2)[3]=&a;

printf("%d,%d,%d,%d,%d\n",*a,a,&a,&a[0],sizeof(a));

printf("%d,%d,%d\n",*(a+1),a+1,&a+1);

printf("%d,%d,%d,%d\n",*p1,p1,p1+1,*(p1+1));

printf("%d,%d,%d,%d,%d,%d\n",*p2,p2,p2+1,*(p2+1),**p2,**(p2+1));

return 1;

}

執行結果如下:

可以發現,當把a陣列定義為字元陣列以後,a和&a的偏移量分別變為1和3了。但是我們卻用乙個int*型和乙個int(*)[3]型的指標分別指向a和&a。這樣直接導致了*p1和**p2是乙個不確定的值。所以我們最好不要用這種型別轉換。當我們把指標改為char型,則會顯示出正確的答案。

此處為什麼無法列印出*p1和*p2的值呢?

這是乙個問題。

C 一些問題

1 if else語句和switch case語句的效率分析對比 switch效率高。switch的效率與分支數無關,當只有分支比較少的時候,if效率比switch高,因為switch有跳轉表。分支比較多,那當然是switch 根據大量的實際程式測試 不考慮不同的編譯器優化程度差異,假設都是最好的優...

C中關於陣列的一些問題

int arr 4 這裡的4必須是乙個常量常量定義方式有 1.巨集定義 define size 4 此時可以使用為 int arr size 2.列舉 enum size 3.const修飾 const int size 4 此時的const修飾的常量不可以用作陣列的常量表示式!這是因為c語言本身並...

C中陣列指標的一些問題

1.有乙個二維陣列 int a 3 4 對於a相關的一些指標,具體含義如下 對於一位陣列int a 10 a是陣列首元素的位址,a是整個陣列的位址。所以a 1和 a 1的步長不一樣,前者的步長是4,後者的步長是40。2.定義乙個陣列型別 typedef int myarray 10 myarray ...