2010-01-19 21 views
2

代碼:傳遞包含指向數組功能正常

/* 
* code.c 
*/ 
#include <stdio.h> 

void printArray(int iXArray, int iSize); 

int main() { 
    int array1[] = {7, 9, 3, 18}; 
    int *array2[] = {array1 + 0, array1 + 1, array1 + 2, array1 + 3}; 

    printArray(array2, 4); 

    return 0; 
} 

// This should print the values in array1 
void printArray(int iXArray, int iSize) { 
    int iCntr; 
    for (iCntr = 0; iCntr < iSize; iCntr++) { 
     printf("%d ", *iXArray[iCntr]); 
    } 
    printf("\n"); 
} 

我的編譯器不同意這個代碼。 - [Warning]傳遞`printArray'的arg 1時,不會轉換指針的整數 - printArray(array2,4); - [錯誤]下標值既不是數組也不是指針 - printf(「%d」,* iXArray [iCntr]);

我在做什麼錯,爲什麼?我該如何解決?

回答

7

試試這個:

void printArray(int **iXArray, int iSize) ... 

在您的例子您提供(INT *),從而可以參照它作爲一個,你必須告訴編譯器期望指針數組的數組。

默認情況下傳遞數組是通過引用。如果你改變陣列的內容,它也會在被測對象那邊改變。指針本身是按值傳遞的,所以改變iXArray參數的值(iXArray = (int**)123;)不會改變被調用者側的array2指針。

如果你想通過值傳遞數組,就需要將其包裝在一個值類型:

typedef struct { 
    int A[123]; 
} Array; 

Array incrementArray(Array array, int count) { 
    for (int i=0; i<count; i++) { 
     array.A[i]++; 
    } 
    return array; 
} 
+0

我應該提到如果我決定使用此函數編輯它,我希望第一個數組保持不變。如果我編輯array2,我會改變指針。 – Pieter 2010-01-19 13:28:30

+0

結構修改應該允許你這樣做。 – 2010-01-20 06:27:58

3

你傳入的指針數組來詮釋:

void printArray(int *ixArray[], int iSize) 
+0

哎呦。雖然這並沒有解決。 – Pieter 2010-01-19 13:30:32

+0

哎呀。是的,它確實。 – 2010-01-19 13:46:56

+0

@ Leonardo:Richard最初有'int iXArray []',這並不能解決彼得的問題。 – 2010-01-19 13:54:35

0

關於「保持不動」。你通過引用傳遞東西,所以防止它們被編輯的方式是使它們成爲const。根據您不想更改的部分,您有幾個不同的選項。但是,這不會讓你改變他們你的功能。它聽起來像是你想要一個傳值的值,除非你自己創建手動拷貝,否則你不能用C++獲取數組。

0

這似乎工作,沒有通過printArray編輯array1。

/* 
* code.c 
*/ 
#include <stdio.h> 

void printArray(int *iXArray[], int iSize); 

int main() { 
    int array1[] = {7, 9, 3, 18}; 
    int *array2[] = {&array1[0], &array1[1], &array1[2], &array1[3]}; 

    printArray(array2, 4); 

    return 0; 
} 

// This should print the values in array1 
void printArray(int *iXArray[], int iSize) { 
    int iCntr; 
    for (iCntr = 0; iCntr < iSize; iCntr++) { 
     printf("%d ", *iXArray[iCntr]); 
    } 
    printf("\n"); 
} 
0

這工作也:

/* 
* code.c 
*/ 
#include <stdio.h> 

void printArray(int **iXArray, int iSize); 

int main() { 
    int array1[] = {7, 9, 3, 18}; 
    int *array2[] = {array1 + 0, array1 + 1, array1 + 2, array1 + 3}; 

    printArray(array2, 4); 

    return 0; 
} 

// This should print the values in array1 
void printArray(int **iXArray, int iSize) { 
    int iCntr; 
    for (iCntr = 0; iCntr < iSize; iCntr++) { 
      printf("%d ", *iXArray[iCntr]); 
    } 
    printf("\n"); 
} 

指針算術完美的作品。