2014-06-09 57 views
5

我想學習C中的指針,並且已經通過了概念。我遇到了這個實驗問題,並試圖爲它寫一個解決方案。C中指向一個字符的指針是什麼?

/* p1.c 
Write a short C program that declares and initializes (to any value you like) a 
double, an int, and a char. Next declare and initialize a pointer to each of 
the three variables. Your program should then print the address of, and value 
stored in, and the memory size (in bytes) of each of the six variables. 
Use the 「0x%x」 formatting specifier to print addresses in hexadecimal. You 
should see addresses that look something like this: "0xbfe55918". The initial 
characters "0x" tell you that hexadecimal notation is being used; the remainder 
of the digits give the address itself. 
Use the sizeof operator to determine the memory size allocated for each 
variable. 
*/ 

不過,我有錯誤的兩大類,當我編譯程序 -

  1. 的printf語句我的格式佔位符似乎是完全錯誤的。我以爲內存地址可以用%x或%p打印。但在我的程序中,都產生了編譯器警告。我不明白 - 爲什麼在我之前的一些程序中,%p沒有任何警告地工作,爲什麼%x和%p在這裏都不起作用。有人可以幫助我瞭解哪些佔位符處理哪些數據類型?

  2. 另一個主要問題是分配指向字符變量的指針。當我運行這個程序時,我在程序的第三個printf語句中出現分段錯誤。我不知道爲什麼它是所謂

如果我是正確的,像這個 -

char array[]="Hello World!" 

char *ptr=array

聲明設置字符指針變量ptr指向數組變量array的第一個元素。因此,理想情況下,*ptr將表示'H',*(ptr+1)將表示'e'等。

遵循相同的邏輯,如果我有一個字符變量var3與字符'A',那麼我應該如何使指針變量ptr3指向它?

這裏的節目,我wrote-

#include<stdio.h> 

int main() 
{ 
int var1=10; 
double var2=3.1; 
char var3='A'; 

int *ptr1=&var1; 
double *ptr2=&var2; 
char *ptr3=&var3; 

printf("\n Address of integer variable var1: %x\t, value stored in it is:%d\n", &var1, var1); 
printf("\n Address of double variable var2: %x\t, value stored in it is:%f\n", &var2, var2); 
printf("\n Address of character variable var3: %x\t, value stored in it is:%s\n", &var3, var3); 

printf("\n Address of pointer variable ptr1: %x\t, value stored in it is:%d\n", ptr1, *ptr1); 
printf("\n Address of pointer variable ptr2: %x\t, value stored in it is:%f\n", ptr2, *ptr2); 
printf("\n Address of pointer variable ptr3: %x\t, value stored in it is:%s\n", ptr3, *ptr3); 

printf("\n Memory allocated for variable var1 is: %i bytes\n", sizeof(var1)); 
printf("\n Memory allocated for variable var2 is: %i bytes\n", sizeof(var2)); 
printf("\n Memory allocated for variable var3 is: %i bytes\n", sizeof(var3)); 

printf("\n Memory allocated for pointer variable ptr1 is: %i bytes\n", (void *)(sizeof(ptr1))); 

return 0; 
} 

任何幫助將非常感激。謝謝。

+0

'%C'爲字符。 '%s'用於空終止的字符串。你有一個字符。 – user2357112

+1

「在C中指向一個字符的指針是什麼?」 *一個人物***。 –

+0

爲什麼要將'sizeof(ptr1)'強制轉換爲'void *'? – user2357112

回答

6

除了char的printf說明符是%c(不是%s)之外,您完全正確。

按照同樣的邏輯,如果我有一個字符變量var3與焦炭'A',那我應該怎麼做一個指針變量ptr3點呢?

查看你的代碼找到答案!

Hoewver you ave type mismatches in other printf statements。在最後一個你使用%i(void *),我不知道你在那裏想什麼。

要打印sizeof的結果,請使用%zu(並且不要投射到void *),這適用於最終的四個printf語句。

在其他語句中,您使用%x來打印地址。這是錯誤的(你的課程也是錯誤的,建議這也是)。您應該使用%p來打印地址。

從技術上講,你也應該把地址改爲void *,儘管在現代系統中所有的指針都具有相同的大小和表示,所以你不會這樣做。

+0

感謝您提供這些信息,這非常有幫助。我真的很驚訝,到目前爲止我遇到的材料都沒有提到使用'%zu'打印'sizeof'運算符的結果。這改正了我的解決方案,以及'%c'。只有一件事 - 我不明白爲什麼需要指向'void *'來指示指針,請問您也可以提供建議嗎? –

+1

'%p'說明符需要一個'(void *)',如果你給它別的東西,那麼它會嘗試讀取內存,就像你給出了一個'void *'。如果你給它的東西實際上是散步並且像'void *'一樣說話,那麼它就會消失,否則它不會。 –

+3

'%zu'於1999年加入,一些參考資料還沒有趕上那麼遠(和一些編譯器* coughMSVCcough *花了很長時間趕上) –

0

至於使用0x%x符\格式,然後打印的第一個字符串應該是這樣的,比如你的任務要求: printf("\n Address of integer variable var1: 0x%x\t, value stored in it is:%d\n", (unsigned int)&var1, var1); 接下來,我相信你會明白同樣的方式。

1
printf("\n Address of character variable var3: %x\t, value stored in it is:%s\n", &var3, var3); 

printf("\n Address of pointer variable ptr3: %x\t, value stored in it is:%s\n", ptr3, *ptr3); 

這裏是您問題。看看的printf和它的說法,precisly:

%S%S使用打印

什麼是字符串?

字符串由定義0+字符加'\ 0'字符。

這裏有什麼問題?

VAR3聲明焦炭,所以一個

printf嘗試做什麼?看看你的記憶:

(aa125121)(內存隨機地址) ○○○

  • 大膽是你的性格
  • ○○○是另一個程序存儲器

的printf嘗試在65和閱讀成功(打印)

的printf嘗試閱讀一些 '\ 0' 或其它字符值BAMMM分段錯誤

你程序訪問錯誤的內存地址

Soluce

使用%C

相關問題