1樓:一口沒水的枯井
1 在c語言中,二維陣列的下標可以為負數,表示指向前面的元素
2 對於二維陣列 int arr[m][n]來說,arr[i][j]的地址是 (*arr)+i*n+j,其值是*((*arr)+i*n+j)
3 分析本題
陣列a在初始化時後,其元素按照在記憶體中的排列順序依次為1,2,3,0, 4,5,6,0, 0,0,0,0
陣列a的第一個元素的地址為*a(或&a[0][0]或a[0]),記為p,
則,a[2][-2]的地址就是 p+2*4+(-2) 即p+6,即指向第7個元素,其值為6;
同理,a[1][3]的地址為p+1*4+3,即p+7,即指向第8個元素,其值為0
所以i的值為6
2樓:窗前過馬
在這裡這不是一個錯誤,但是一般不會寫這樣的程式。
首先應該理解語言中陣列的儲存結構。對二維陣列,在記憶體中實際是按行儲存的,也就是說二維陣列中元素是按行依次儲存在一片連續的的空間中。
取某個元素時,是先通過計算這個元素的地址,再通過計算得來的地址取得該元素的。依然以二維陣列為例,設陣列a[rows][cols](即有rows行,cols列),當訪問a[i][j]的時候,是先通過i,j的值計算得到要取的元素的地址,再在這個地址上取得該值的。計算地址的方法是:
a + i*cols + j, 這裡a就是陣列名,它實際存放著上是這個陣列的每一個元素的地址。
因此,對於您的問題, 可能計算得到a[2][-2]的元素地址為 a+2*4 + (-2) = a + 6 = a + 1*4 + 2
它的地址與元素a[1][2]的地址一樣,也就是說a[2][-2]與a[1][2]實際上是同一個元素。因此輸出6,這是正常的現象。
3樓:匿名使用者
著因該是 錯誤的``````
陣列的下標是從0開始的`````
不可能有 -2;
有什麼不懂 你可以給我簡訊```
4樓:匿名使用者
我想那是一個錯誤,這是明顯的陣列越界~ 學這麼長時間c語言,我從來就沒有見過~
5樓:5舍
確實很奇怪,應該是錯的.
6樓:匿名使用者
應該是寫錯了吧。沒見過這樣的
c語言陣列下標可以為負嗎
7樓:金色潛鳥
分清宣告還是語句。
宣告裡的中括號裡的數字不能為
負。例如 int a[-2]; 是錯的,陣列大小不能為負。
語句裡的中括號,c/c++ 看成運算子,不叫標點符號。
陣列元素和指標有恆等關係:
a[i] == *(a+i)
所以,i 為 負 的時候,a[i] == *(a- fabs(i))。只要 a-fabs(i) 這個地址裡 有 數值,就可以拿來 運算使用。
"很多書上說陣列下標不能為負" -- 因為是初級教材。
高階教材裡甚至提到, a[i] == i[a] 這也是正確的 !(有人在「知道」裡問過,我也回答過。)
當然,只能是變數形式,不能寫阿拉伯數字,事實上,也確確實實正確的。
8樓:
下標可以是負值,它的意思是向前定址,前提是你知道向前定址尋的記憶體地址的東西是你之前已經指定好的,就相當於你動態開闢一塊記憶體給你的陣列,這樣這個記憶體裡面的所有資料都是你需要的,向前定址也沒什麼問題。
9樓:匿名使用者
不可以,下標必須是整數
c語言新手提問 如何定義陣列下標為負數的陣列
10樓:匿名使用者
type a[19];
type *a=&a[10];
於是,a成為一個下標為-9~9的type型陣列這東西純粹娛樂用,你剛開始學還是離這些東西遠一點
11樓:匿名使用者
下表為負的數bai組在du c 語言裡並不是不能做到。zhi首先,建立一dao個正常的陣列 int a[20];。然後用回指標指向其中間的元素
答 int *a2 = &(a[10]);
這樣,a[-10 ... 9] 就是一個可用的有效範圍了。
/* 樣例示範 */
#include
int main(int argc, const char *argv)
12樓:匿名使用者
我想那是一個錯誤,這是明顯的陣列越界 學這麼長時間c語言,我從來就沒陣列的下標是從0開始的` 不可能有 -2; 有什麼不懂 你可以給我簡訊`
13樓:末暉
我記得下陣列的下標沒有負數,最低是a[0],這個系統規定了的
14樓:匿名使用者
c語言不同於pascal和basic,c的陣列下標只能從0開始,
自已再做加減
15樓:盍然泥夜蓉
第一:下bai標是用在陣列du中的;
第二:定義陣列的
是時zhi候下標是代dao表陣列的長度專,比如inta[5];就是定義一個長度為屬5的存放整型的陣列,陣列就是集合,陣列a有5個元素,即a[0],a[1],a[2],a[3],a[4],
一共5個元素,此時下標就是第幾個元素的意思。
例子如下:
inta[5]=;
printf("%d,%d,%d,%d,%d",a[0],a[1],a[2],a[3],a[4]);
//會輸出1,2,3,4,5
a[0]
=10;
printf("%d",
a[0]);
//輸出10
c語言中二維陣列下標問題
16樓:嘟
a可以理解為二重指標,a[0]理解指標,a[0][0]是對這個地址進行訪問了
。其實回[ ]的意義 可以理解成* 。
a[ i ]其實就相當於*(a+i) 所以原答來的就相當於 *(*(a+i)+j) +的優先順序比 *的高 所以外面那個括號可以去掉 就變成了 **(a+i)+j 。
明白了嗎?
17樓:朱豬丹
這裡a指的是整個陣列,而a[0]指二維陣列第一行的元素,a[0][0]指陣列中的第一個元素。
18樓:匿名使用者
a為二重指標,a[0]是指標,a[0][0]是元素,
19樓:匿名使用者
樓上回答的不錯,頂一個。
c語言二維陣列下標的值怎麼算
20樓:v側耳傾聽
陣列的下標是從0開始,由於陣列是連續儲存的,你可以想象用一個4x4的**來表達這個陣列,然後把for迴圈體內語句中陣列對應的下標值根據算術表示式進行計算就可以啦。
for(i = 0; i < 4; i++)s += a[i][1]; // 等同於 s = s + a[i][1];
由這個迴圈語句可知,將陣列a[0][1],a[1][1],a[2][1],a[3][1]的值相加求和。即:
2+6+9+2 =19,其他的陣列下標都可用這種方法來計算。
21樓:匿名使用者
你列印出來,就清楚了啊
書上面都有吧
c語言二維陣列下標表示方法
22樓:匿名使用者
下標就是在裡的,他是重0開頭的。具體表示如下:
int a[5];//5代表a最後個陣列裡的元素個數
是初學者吧! 要努力喲!
23樓:匿名使用者
int n;
float a[n][n];
都是從0開始到n-1
c語言二維陣列
因為你的s是一個二維陣列。如果你的s是一維陣列,像s 20 這樣,那麼在gets時不需要加 0 你定義的s是個二維陣列,並且是char型別,所以每一行存放一個字串。s n 代表第n 1行,而gets時的引數需要是一個字串指標,或者字串陣列名,所以這裡必須要寫作gets s n 其中0 n 20 我明...
c語言中二維陣列的定義問題C語言中二維陣列的定義問題
正確寫法如下 char fd jgf1 maxitemlen 1 說明 把null去掉 1.二維陣列的第一個維度預設是 舉個例子 int tar 2 因為大括號中有4個元素,而且第二個維度是2,所以就可以計算出來第一維度是2.所以是可以預設的。2.你的這個例子中,第一維預設的應該是 7 8 1 ma...
c語言for迴圈與二維陣列的問題
首先你所給的程式就存在錯誤,這是我幫你修改後的程式 include stdio.h int main i,k,t for i 0 i 3 i for k i i k 4 k if a i i for i 0 i 4 i printf d,a 0 i return 0 執行後的結果是6,4,3,2.第...