使用 C 中的指针打印字符串



我正在尝试打印从用户读取到程序中的字符串。

我需要能够使用指针打印字符串。

这是我代码的简化版本。

#include <stdio.h>
int main(void)
{
char string[100];
printf("Enter a string: ");
scanf("%s", string);
char *pstring = &string;
printf("The value of the pointer is: %s", *pstring);
return 0;
}

但是我遇到了分段错误

有人可以解释为什么会发生这种情况吗?

您通常不会获取数组的地址,它要么是&string[0]的,要么只是string。 在%sprintf()中,您应该传递char指针而不是char(这就是*pstring)。 最好在printf()格式字符串中添加换行符,因为scanf()不会传递该换行符:

#include <stdio.h>
int main(void) {
char string[100];
printf("Enter a string: ");
scanf("%99s", string);
char *pstring = string;
printf("The value of the pointer is: %sn", pstring);
return 0;
}

string是一个指针。一个不变的。

值得了解什么是数组(与指针相比)。

特别是它们之间的区别:

char *str1=malloc(6);
strcpy(str1, "hello")
char str2[6];
strcpy(str2, "hello");

在此示例中,str1str2都是指针。 但是str1是一个变量(如"int x":x的值存储在内存中,您可以对其进行修改)。而str2则不是。它是一个常数,就像12.它看起来像一个变量,因为它是一个标识符(str2),但它不是。编译后,内存中没有地方存储 str2 值。编译器在编译时计算其值,在生成的机器代码中,该值直接插入到代码中。与"12"完全一样。

所以str2=malloc(6)例如,str2=whatever是没有意义的。无非是打12=612=whatever。它不是一个变量。它是一个常量值。

同样,&str2也没有意义。不比&12多。它将询问存储常量的地址。但是常量不会存储在任何地方。它是直接在代码中的值。

即 str2 是一个地址的常量值,编译器在其中为6个字节提供了足够的空间。所以你可以把东西存储在str2[0], str2[1], ..., str2[5]中,但不能存储在str2本身中(同样,它是一个常量值,而不是一个变量。你不能在其中存储东西,就像你不能在12中存储东西一样

)str1 是一个变量,声明为char *型。您可以在其中存储char *类型的值(即指向 char 的指针,即存储 char 的内存地址)。该声明会影响此变量的默认(初始)值,该值是 6 个字节的地址,包含字母"h"、"e"、"l"、"l"、"o"和终端 0。

因此,您可以轻松更改 str1,并将所需的任何指针存储在 str1 中。例如,编写str1=str2

所以,长话短说:两者都是指针。 str2 是一个常量指针,但仍然是一个指针。两者都是内存中存储字符串的第一个、第二个等字符的位置的地址。

因此,在您的情况下,只需输入

char *pstring=string

或直接使用string。 或者,出于美学目的,为了澄清您的意思是"字符串第一个字符的地址",您可以键入

char *pstring = &(string[0])

这与"字符串"完全相同(在 C 中,语法a[b]只是*(a+b)的快捷方式,所以&(string[0])&(*(string+0)),这是&*string哪个是string(另一个奇怪的后果是,你也可以说

char *pstring = &(0[string])

同样,这只是意味着&(*(0+string))

请注意,我不建议那些奇怪的写作。但它有助于理解指针是如何只是值的,你可以将其存储在变量中(如 str1)或直接用作代码中的常量(如 str2)。它只是不如整数(x声明为int x=12;的变量与12常量)那么明显,因为在数组(常量指针)的情况下,这些值由编译器命名,并在代码中采用标识符的具体外观。

相关内容

  • 没有找到相关文章

最新更新