2013-03-04 156 views
1

我寫了一個小測試程序來看看我可以如何將一個指向字符數組的指針傳遞給一個函數。這是我的代碼:傳遞一個指向char數組的指針c

#include <stdio.h> 
#include <string.h> 

int scopy(char *org){ 
    printf("the value of org is %s" , org); 
    printf("\n"); 
} 

int main(void) 
{ 
    char original[11]; 
    strcpy(original , "helloworld"); 

    scopy(original); 

    printf("the value of original now is %s" , original); 

    return 0; 
} 

我指針的知識告訴我,組織是傳遞的原始[0],當我執行這個節目,我觀察到,混淆了我的幾件事情的內存地址的指針和已經讓我懷疑我所瞭解的有關指針的事實。

當我打印org時,我得到完整的單詞。但根據邏輯指針是不是應該打印出內存地址;

當我嘗試打印出來了[1],出來[2],鍵盤告訴我,過程異常結束

我在這個問題的根本的疑問是究竟是什麼組織做的,我明白這是一個字符指針指向一個內存地址(哪??)。任何幫助,將不勝感激 。我對c編程非常陌生。

此外,當我試圖像

while(out[i] !='\0') 
printf("%s",out[i]); 

它不會在 '\ 0' 終止while循環。 strcpy文檔聲明'\ 0'被複制到char數組中。

回答

3

org是一個指向char的指針,這是您在scopy中傳遞的指針(指向數組的第一個元素的指針)。在printf中使用說明符%s時,您將字符串的指針視爲字符串;如果你想打印它的值作爲指針,你應該使用%p來代替。例如:printf("The memory address in org is %p\n", org);

從你說什麼我得到你認爲%s將轉換爲字符串的感覺。它不會那樣做,它期望一個指向字符串的第一個字符的指針。

請記住,數組的名稱相當於&array[0],即當您傳遞函數中的數組的名稱時,您正在將指針傳遞給第一個元素。因此,在這裏,當您撥打scopy(original)時,它與編寫scopy(&original[0])相同,並且由於original[0]char&是指向它的指針,所以您的功能需要char *

0

是的,您說的對,當您撥打scopy(original);時,scopy會通過指向original陣列中的1.元素的指針。

scopy(original);是完全相同的scopy(&original[0]);

但是,你用%s的printf的。 %s期望匹配參數是一個char指針,指向一個字符序列,並且該序列的結尾是一個0字節。這就是C所稱的字符串。

這意味着你不能做printf("%s",org[i]);,因爲org [i]是一個char,它不是一個以0字節結尾的數組中的char指針。

你可以通過做一個字符打印prinf["%c", org[0])`while(out [i]!= '\ 0')

或者您while循環:

while(out[i] !='\0') 
    printf("%c",out[i]); 

而且你也可以試試:

while(out[i] !='\0') 
    printf("%s",&out[i]); 
相關問題