2013-10-31 70 views
4

我試圖切換中C.整數數組的起始索引爲了精確,我有以下的數組:如何移動C中數組的起始索引?

{ int array[4] = {1,2,3,4};} 

我希望改變{陣列}至3項包含數組{2 ,3,4}。我想知道是否有一種簡單的方法來使用指針來完成此操作,並且不會移動數組中的所有元素。我也很高興,只要前三項是{2,3,4},{array}仍然是一個4個數組的數組。我試過如下:

{array = &(array[1])} 

然而,這並不工作,我得到一個錯誤說{不兼容的類型分配給輸入「INT [4]」從類型「詮釋*」時}。

我的印象是C數組是對數組的第一個元素的引用。

任何人都可以幫助我嗎?

+0

這種印象是一種誤解,它仍然被錯誤地認爲是「更直觀」,因此仍然被教導。它遲早會在後面咬一個。 – StoryTeller

+0

數組名稱是一個**常量**,用於描述爲該數組分配的整個內存塊。它永遠不能分配給。當作爲*值*使用時,它會自動轉換爲指向第一個元素的指針,通過該指針可以訪問和修改數組元素。 –

+0

@DaleHagglund:數組名稱是數組類型的表達式。它可以在某些上下文中隱式轉換爲指針值*。數組類型的表達式不能在C中分配,而不僅僅是數組名稱。 – newacct

回答

9

您有幾種選擇:一個

離開

移動的所有元素如果不需要的內容保存:

int array[4] = { 1, 2, 3, 4 }; 

然後複製/移動從要素索引位置n到索引位置n-1:

例如:

int i; 
for (i = 1; i < n; ++i) 
    array[i-1] = array[i]; 

您還可以查看memmove這可能更有效。

例如,

memmove(array, array+1, sizeof array - sizeof *array); 

其做同樣的事情與上述循環。

元素複製到一個新的數組忽略第一

如果需要對原始數據保存,那麼你可以創建另一個陣列和元素複製到忽略第一個元素。

例如,

int array1[4] = { 1, 2, 3, 4 }; 
int array2[3]; 
int i; 

for (i = 0, i < SIZE_OF_SMALLER_ARRAY; ++i) 
    array2[i] = array1[i+1] 

使用指針來引用數組[1]數組[0]

如果要使用指針無需移動/複製數據:

int array[4] = { 1, 2, 3, 4 }; 
int *pArray = &array[1]; 

現在粒子陣列指向有效陣列中的第二元件允許你索引陣列[1]作爲粒子陣列[0]

使用int指針

int array[4] = { 1, 2, 3, 4 }; 
int *parray[3]; 

int i; 
for (i = 0; i < SIZE_OF_SMALLER_ARRAY; ++i) 
    parray[i] = &array[i+1]; 

陣列注意事項

有一件事你不能做的是...

int array1[4] = { 1, 2, 3, 4 }; 
array1 = &array1[1]; // !! Compiler Error !! 

原因是array1non-modifiable l-value。基本上是一個常數。

你也可以這樣做......

int array1[4] = { 1, 2, 3, 4 }; 
int array2[4] = array[1] // !! Compiler error !! 

這裏的原因是你無法在這種情況下初始化數組。

+0

需要注意的一點是,給定'int array [4]',你可以使用'sizeof'來獲得數組的大小,從而得到元素的數量('sizeof array/sizeof array [0]')。大多數這些解決方案(這是完全有效的)不給你一些你可以有意義地應用'sizeof'的東西。 –

0

你不能「縮小」或「擴大」即。改變在C/C++中以這種方式創建的數組大小。

你可能會看到的是動態內存分配,你可以用它來做這樣的事情。

1

你可以做到這一點,p點在原來的array雖然。 array保持不變。

#include <stdio.h> 

int main(void) { 
     int array[4] = {1,2,3,4}; 
     int *p = array + 1; 
     printf("%d %d %d\n", p[0], p[1], p[2]); 
     return 0; 
} 

打印 「2 3 4」

可以使用移位memmove陣列,但它確實走動的所有位。 數組可以複製memcopy,再次複製位。

如上所示,指針允許您在數組內移動。

相關問題