在C语言中,字符指针指向什么?

5

我正在尝试学习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'以此类推。

按照相同的逻辑,如果我有一个带有字符'A'的字符变量var3,那么我应该如何使指针变量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;
}

任何帮助都将不胜感激。谢谢。

%c 用于字符。%s 用于以 null 结尾的字符串。你有一个字符。 - user2357112
1
在C语言中,指向字符的指针指向什么?一个字符。 - Elliott Frisch
你为什么要将 sizeof(ptr1) 强制转换为 void * - user2357112
1
指向字符的指针指向单个字符,就像指向整数的指针指向单个整数一样,指向双精度的指针指向一个双精度等等。任何指针都可以指向指针所属类型的数组,但这是您无法从指针中确定的程序逻辑问题。 - Bob Jarvis - Слава Україні
一个字符指针指向你的字符的引用。 - Kim Honoridez
@KissaSy - "...指向你角色的引用"?请解释一下你的意思。谢谢。 - Bob Jarvis - Слава Україні
3个回答

6
你的全部内容都是正确的,除了 char 的 printf 格式符应该是 %c(而不是 %s)。
按照同样的逻辑,如果我有一个字符变量 var3,它的值为 'A',那么我应该如何使指针变量 ptr3 指向它?
参考你的代码来找到答案吧!
然而,在其他 printf 语句中你有一些类型不匹配。在最后一个 printf 语句中,你使用 %i 来输出 (void *),我不确定你当时在想什么。
要打印 sizeof 的结果,请使用 %zu(不要将其转换为 void *),这适用于最后四个 printf 语句。
在其他语句中,你使用 %x 来打印地址。这是错误的(你的课程也不应该给出这种建议)。你应该使用 %p 来打印地址。
严格来说,你还应该将地址转换为 void *,尽管在现代系统上,所有指针都具有相同的大小和表示,所以你可以不进行转换。

谢谢您提供这些信息,它们真的很有帮助。我真的很惊讶到目前为止我遇到的所有材料都没有建议使用%zu来打印sizeof运算符的结果。这纠正了我的解决方案,还有%c。只有一件事-我从未理解为什么需要将指针强制转换为void *,您能否也就此提供建议? - Manish Giri
1
%p 格式说明符期望一个 (void *),如果你给它其他类型的数据,那么它会尝试读取内存,就好像你给了一个 void * 一样。如果你提供的数据确实像 void * 一样,那么它可以正常工作,否则就不行。 - M.M
3
%zu 是在1999年添加的,一些参考资料还没有更新到那个时候(还有一些编译器coughMSVCcough花了很长时间才追上)。 - M.M

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和它的参数,确切地说:

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

什么是字符串?

字符串由0个或多个字符加上'\0'字符定义。

问题在哪里?

Var3声明char,因此不是一个字符串

printf试图做什么?看一下您的内存:

(aa125121)(随机内存地址)65aa aa aa

  • 粗体是您的字符
  • aa aa aa是另一个程序的内存

printf试图读取65并成功(将其打印出来)。

printf 尝试读取一些 '\0' 或其他字符值BAMMM 分段错误

您的程序访问了一个错误的内存地址

解决方法

使用 %c


0

由于您的任务需要使用0x%x格式说明符,因此打印的第一个字符串应该像这样: printf("\n整数变量var1的地址:0x%x\t,存储在其中的值为:%d\n",(unsigned int)&var1,var1); 接下来我相信您会以同样的方式理解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接