簡體   English   中英

指向字符的指針在C中指向什么?

[英]What does a pointer to a character point to in 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' ,依此類推。

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

這是我寫的程序 -

#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;
}

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

除非char的printf說明符是%c (而不是%s ),否則所有這些都是正確%s

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

請參閱您的代碼以獲得答案!

Howwver你在其他printf語句中有一些類型不匹配。 在最后一個你使用%i (void *) ,我不確定你在想什么。

要打印sizeof使用%zu的結果(並且不要轉換為void * ),這適用於最后四個printf語句。

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

從技術上講,你也應該將地址轉換為void * ,盡管在現代系統中,所有指針都具有相同的大小和表示,所以你可以不去做。

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和它的論點:

%s ,%s用於打印字符串

什么是字符串?

字符串由0+個字符和'\\ 0'字符定義。

這里有什么問題?

Var3 聲明char ,因此不是 字符串

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

(aa125121) (記憶隨機地址) 65 aa aa aa

  • 大膽是你的角色
  • aa aa aa是另一個程序存儲器

printf嘗試在65 讀取成功 (打印)

printf嘗試讀取一些'\\ 0'或其他字符值BAMMM分段錯誤

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

解決方案

使用 %c

由於您的任務需要使用0x%x說明符\\格式,因此第一個打印字符串應該是,例如: printf("\\n Address of integer variable var1: 0x%x\\t, value stored in it is:%d\\n", (unsigned int)&var1, var1); 接下來我相信你會理解同樣的道理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM