複選題
9.下列C語言片段如下 int i[]={10,20,30,40,50}; int *ptr= i+2; 請問下列何者有誤?
(A) i[5]=50
(B) ptr[0]=30
(C) *(ptr + 1) =40
(D) *(i + 1) = 20

答案:登入後查看
統計: A(244), B(144), C(91), D(81), E(0) #1211734

詳解 (共 4 筆)

#4061462
int i[]={10,20,30,40...
(共 143 字,隱藏中)
前往觀看
3
4
#5638550

不知道是不是太少人做到這題 這題怎麼看我都不太懂為何是複選...

看起來只有A有問題

1
0
#6417564

我們定義了一個整數陣列 i,其內容為 {10, 20, 30, 40, 50}。這個陣列有 5 個元素,索引分別是 0, 1, 2, 3, 4。

接著,我們定義了一個整數指標 ptr,並將其指向 i + 2。在 C 語言中,陣列名稱 i 在這裡會被隱式地轉換為指向其第一個元素的指標。i + 2 的意思是將指向陣列第一個元素的指標向後移動兩個整數的位置。因此,ptr 現在指向陣列 i 的第三個元素,也就是值為 30 的元素。

現在我們逐一分析每個選項:

(A) i[5]=50

  • 陣列 i 的有效索引範圍是從 0 到 4。
  • i[5] 試圖存取陣列中第六個元素,這超出了陣列的邊界。
  • 在 C 語言中,存取超出陣列邊界的記憶體是未定義行為 (Undefined Behavior),可能會導致程式崩潰、資料損壞或其他不可預測的結果。
  • 因此,i[5]=50 這個寫入操作是錯誤的

(B) ptr[0]=30

  • ptr 目前指向 i[2],其值為 30。
  • 在 C 語言中,指標可以像陣列一樣使用索引。ptr[0] 等同於 *(ptr + 0),也就是指標 ptr 所指向的記憶體位置的值。
  • 由於 ptr 指向 i[2],所以 ptr[0] 的值是 i[2] 的值,即 30。
  • 因此,ptr[0]=30 這個敘述是正確的(讀取操作)。

*(C) (ptr + 1) =40

  • ptr 指向 i[2]。
  • ptr + 1 會將指標向後移動一個整數的位置,使其指向 i[3],其值為 40。
  • *(ptr + 1) 表示取 ptr + 1 所指向的記憶體位置的值,也就是 i[3] 的值,即 40。
  • 因此,*(ptr + 1) =40 這個敘述是正確的(讀取操作)。

*(D) (i + 1) = 20

  • i 在這裡被視為指向陣列第一個元素的指標 (&i[0])。
  • i + 1 會將指標向後移動一個整數的位置,使其指向 i[1],其值為 20。
  • *(i + 1) 表示取 i + 1 所指向的記憶體位置的值,也就是 i[1] 的值,即 20。
  • 因此,*(i + 1) = 20 這個敘述是正確的(讀取操作)。

結論:

根據以上的分析,選項 (A) i[5]=50 試圖存取超出陣列邊界的元素,是錯誤的

因此,答案是 (A)

0
0
#3711645
原本題目:9,下列C語言片段如下inti...
(共 274 字,隱藏中)
前往觀看
0
1