2013-08-07 109 views
1

的單個字符據我所知,像指向一個二維陣列

INT示例的陣列[10]

不是別的,只是在一個指針的第一個元素這個數組。

的char * argv的[]

是一個指針陣列;所以應該是指向其他指針的指針。

我現在下面的問題:

int main(int argc, char* argv[]) 
{ 
    double ptrarg2=argv[2][1]; 
    printf("beginletter=%c\nbeginpos=%d\n",&ptrarg2, ptrarg2); 
    return 0; 
} 

我開始計劃與./program test和期望的輸出是:

beginletter=c 
beginpos=123213123 

雖然123213123應該是ADRESS所在的C實際上存儲。

我卻越來越:

beginletter= 
beginpos=0 

我究竟做錯了什麼?先謝謝你!

+0

你錯過了命令參數中的內容嗎?或者你的數字應該減1。 – Brent81

+0

不,'int example [10]'聲明一個數組對象,而不是,我重複* not *,一個指針對象。數組不是指針。閱讀[comp.lang.c FAQ](http://www.c-faq.com/)的第6節,特別是問題6.3。 –

回答

1

&ptrarg2是本地變量的地址,它不是您所期望的地址。只需使用argv[1][0]argv[1]即可。 argv[1][0]會給你第一個參數的第一個字符,而argv[1]會給你指向第一個參數的指針。

#include <stdio.h> 

int main(int argc, char* argv[]) 
{  
    printf("beginletter=%c\nbeginpos=%p\n",argv[1][0], argv[1]); 
    return 0; 
} 
+0

非常好謝謝你!你能否向我解釋一下負面的地址是什麼意思?我認爲它是這樣的,例如:t @ 111和e @ 112 s @ 113但它是:t @ -1080558759和e @ -1080558758 – SevenOfNine

+0

原因是你正在將存儲器地址解釋爲帶符號的數字, %d「'。內存地址應該使用'「%p」'代替。 – jh314

+0

我愛你!非常感謝你! – SevenOfNine

4

看起來argv[0]將是"./program"argv[1]將是"test",並argv[2]將是未定義或爲空,因爲你沒有三個參數。 argc的值應該告訴你argv[]有多少物品。我的猜測是答案是2,因此只有前兩個(argv[0]argv[1])是有效的。

還有其他幾件奇怪的事情發生在這裏。 ptrarg2被聲明爲double,而不是char;這裏的行爲是將字符轉換爲其浮點數字等值並存儲該字符。也許你的意思是ptrarg2是char?

接下來,printf()與它的其他參數不一致。 &ptrarg2double *,但您將其分配給%c(字符)字段,而不是%p(指針)字段。 ptrarg2double,但您將它分配給%d(十進制數字)字段,而不是%lf(長浮點數,又名雙字段)字段。即使你的類型不匹配,printf也會很樂意嘗試並打印出值,但它們會錯誤的,並且崩潰是很有可能的。

+0

改變雙ptrarg2 = argv [1] [1]給我一個隨機字符和位置0:S – SevenOfNine

+0

看到我的其他評論。你的printf和ptrarg2的類型也有問題。 – AHelps

+0

非常感謝您的幫助! – SevenOfNine