2010-08-20 96 views
2

使用 GCC 4.4.3 C89:訪問一個陣列

我只是工作在下面的下面的代碼:

我只是有關於取消引用src指向一些問題。這是因爲調用函數聲明:

char src[] = "device_id"; 

我的困惑在於取消引用源:

for(i = 0; src[i] != '\0'; i++) { 
    printf("src %d: [ %s ]\n", i, &src[i]); 
} 

src已衰變成一個指針。因此,SRC將指向數組中的第一個元素,這將是字符d:

src -> "device_id" 

所以,當我做到這一點src[i]我提領該值,使之返回字符是目前在指指點點。對於這個例子,當它到達nul時,它將從for循環中斷開。

For example i = 0 

對於&src[i]我得到的是字符的地址而不是字符本身? 那麼src[i]將取消引用並返回d,&src[i]將返回d的地址。因爲*dest[]是一個char指針數組,它需要一個地址。所以在這裏我將字符地址分配給指向char的指針數組。

dest[i] = &src[i]; 

有沒有使用任何&src[i]src[i]在printf函數做要麼這個%s的差異:

printf("src %d: [ %s ]\n", i, &src[i]); 

printf("src %d: [ %s ]\n", i, src[i]); 

的源代碼:

void inc_array(char *src, size_t size) 
{ 
    /* Array of pointers */ 
    char *dest[size]; 
    size_t i = 0; 

    memset(dest, 0, size * (sizeof char*)); 

    /* Display contents of src */ 
    for(i = 0; src[i] != '\0'; i++) { 
     printf("src %d: [ %s ]\n", i, &src[i]); 
    } 

    /* copy contents to dest */ 
    for(i = 0; i < 9; i++) { 
     dest[i] = &src[i]; 
    } 

    /* Display the contest of dest */ 
    for(i = 0; *dest[i] != '\0'; i++) { 
     printf("dest %d: [ %s ]\n", i, dest[i]); 
    } 
} 

非常感謝您的任何建議,

回答

2

對於&src[i]我收到的字符,而不是角色本身的地址?那麼src[i]將取消引用並返回d,&src[i]將返回d的地址。

src[i]相當於*(src + i),所以&src[i]相同&*(src + i),其可被減小到src + i。它只是執行指針算術,不會發生解引用。

src[i]爲您提供了src字符索引i,並&src[i]爲您提供了src的指針i個字符。

+0

爲什麼會有人寫'*(SRC + I)'時,他們可以寫'SRC [I]'?這似乎不必要地混淆了我。 – endolith 2011-12-19 05:20:13

2

格式說明符%s想要插入一個字符串,所以如果您通過它& src [i],它將從src的第i個字符處開始並打印直到null終止符。你幾乎肯定要%C而非%,和src [I],而不是& SRC [1]。

1

是的,有區別。 &src[i]是字符在src[i]地址,當你正確地說。 src[i]是字符本身。

對於使用"%s"進行打印並將其分配給char *對象,&src[i]是正確的表述。

(順便說一句,&src[i]也可以寫爲src + i,如果你喜歡)。