int a[3] = {0,1,2};
数组a和a[0]的地址是一样的. 但是不同在哪儿呢?用它们的地址进行运算的时候不太一样那请问, 这样理解对吗?比如规定数国家省份的时候从西向东数那新疆是中国的第一个省份, 中国的地址和中国[0](新疆)的地址是一样的。但是用来计算的时候,中国++; //就变成了朝鲜, 加一变成了跨国家&中国[0]++; //就变成了青海, 加一只是跨城市
这样理解正确吗?
光阴似箭催人老,日月如移越少年。
位址的值是一樣,但是兩個資料型別不同,&a[0]的型別是int*,而&a的型別是int (*)[3]。
&a[0]
int*
&a
int (*)[3]
補充一下數組名a,數組名是指向數組首個元素的指針,所以在你的例子裡,a和&a[0]是嚴格相等的(類型一樣,值一樣),但到了高維數組,就需要認清首個元素究竟是哪一個,例如:{{1, 2, 3}, {4, 5, 6}},首個元素是哪一個? 1還是{1, 2, 3}?
a
{{1, 2, 3}, {4, 5, 6}}
1
{1, 2, 3}
提出我的答案
貼出我本機的運作結果
#include <stdio.h> int main() { int a[3] = {0, 1, 2}; printf("%p,%p\n", a, &a[0]); printf("%p,%p\n",a+1,&a[0]+1); // 为什么不用,稍后说明 return 0; }
0x7fff5af6e32c,0x7fff5af6e32c 0x7fff5af6e330,0x7fff5af6e330
結論是 a+1,&a[0]+1 結果是一致的那為什麼不用 a++ 呢?
C 裡面變數是可以進行++ 運算的但是這裡宣告了數組,分配了記憶體int a[3] = {0, 1, 2};a 已經是常數了,所以不能進行a++ 運算
至於@leunggamciu 說的資料型別不一樣這個是發生在多維數組裡的int b2,那麼b +1,其實要加+3 個int類型,&b +1,只要加+ 1 個int型別長度
但一維數組裡,是一樣的,沒有差別
我也是剛學 C 語言不久,萬一有什麼不對的地方,請一定要指出,謝謝
你的陣列的位址已經是常數了 ,不能使用自增或自減運算子了,自增運算子應用於左值題目中, 語法就是錯的。 我贊成 @leunggamciu 說法, 類型變了, 借@dryyun 的代號
#include <stdio.h> int main() { int a[3] = {0, 1, 2}; printf("%p,%p\n", a, &a[0]); printf("%p,%p\n",&a+1,&a[0]+1); // 这里的 a在+1前 取地址, return 0; } 题主运行下看看结果吧
位址的值是一樣,但是兩個資料型別不同,
&a[0]
的型別是int*
,而&a
的型別是int (*)[3]
。補充一下數組名
a
,數組名是指向數組首個元素的指針,所以在你的例子裡,a
和&a[0]
是嚴格相等的(類型一樣,值一樣),但到了高維數組,就需要認清首個元素究竟是哪一個,例如:{{1, 2, 3}, {4, 5, 6}}
,首個元素是哪一個?1
還是{1, 2, 3}
?提出我的答案
貼出我本機的運作結果
結論是 a+1,&a[0]+1 結果是一致的
那為什麼不用 a++ 呢?
C 裡面變數是可以進行++ 運算的
但是這裡宣告了數組,分配了記憶體int a[3] = {0, 1, 2};
a 已經是常數了,所以不能進行a++ 運算
至於@leunggamciu 說的資料型別不一樣
這個是發生在多維數組裡的
int b2,那麼b +1,其實要加+3 個int類型,&b +1,只要加+ 1 個int型別長度
但一維數組裡,是一樣的,沒有差別
我也是剛學 C 語言不久,萬一有什麼不對的地方,請一定要指出,謝謝
你的陣列的位址已經是常數了 ,不能使用自增或自減運算子了,自增運算子應用於左值
題目中, 語法就是錯的。
我贊成 @leunggamciu 說法, 類型變了, 借@dryyun 的代號