2

我最近才开始学习 C。我正在研究数组和指针的概念,当我在理解它时遇到了一个绊脚石。

考虑这段代码 -

#include<stdio.h>

int main()

 {

 char string[]="Hello";
 char *ptr;

 ptr=string;

 puts(*ptr);

 return(0);

 }

它可以编译,但在执行时遇到分段错误。

我得到的警告是:

在“puts”的参数 1 中输入错误;发现 'char' 预期 'pointer to char'

现在 *ptr 确实返回一个字符“H”,我最初的印象是它只接受一个字符作为输入。

后来,我开始明白 puts() 需要一个指向字符数组的指针作为输入,但我的问题是当我传递这样的东西时 - puts("H") 与 puts(* ptr),假设 *ptr 确实包含字符“H”。

4

6 回答 6

3

"H"是一个字符串文字,由 2 个字节'H''\0'. 每当您的代码中有“H”时,就意味着指向具有 2 个字节的内存区域的指针。*ptr只返回一个char变量。

于 2012-10-05T16:00:01.580 回答
2

通过这样做puts(*str),您将取消引用该str变量。然后,这将尝试使用“H”字符作为内存地址(因为那是str)指向的内存地址,然后是段错误,因为它将是一个无效的指针(因为它可能会落在您的进程内存之外)。这是因为该puts函数接受一个指针作为参数。

你真正想要的是puts(str)

顺便说一句,后一个示例puts("h")在编译时用“h”填充字符串表,并用隐式指针替换那里的定义。

于 2012-10-05T15:59:37.387 回答
2

puts() 函数接受一个指向字符串的指针,而您正在做的是指定单个字符。

看看这个第 9 课:C 字符串

所以与其做

#include<stdio.h>

int main()

 {

 char string[]="Hello";
 char *ptr;

 ptr=string;    // store address of first character of the char array into char pointer variable ptr
                // ptr=string is same as ptr=&string[0] since string is an array and an
                // array variable name is treated like a constant pointer to the first
                // element of the array in C.
 puts(*ptr);    // get character pointed to by pointer ptr and pass to function puts
                // *ptr is the same as ptr[0] or string[0] since ptr = &string[0].
 return(0);

 }

你应该改为

#include<stdio.h>

int main()

 {

 char string[]="Hello";
 char *ptr;

 ptr=string;  // store address of first character of the char array into char pointer variable ptr

 puts(ptr);  // pass pointer to the string rather than first character of string.

 return(0);

 }
于 2012-10-05T16:00:18.097 回答
1

当您在gets 中输入字符串或想要使用 puts 显示它时,您必须实际传递指针或字符串的位置

例如

char name[] = "Something";

如果你想打印那个

你必须写printf("%s",name); --> name actually stores the address of the string "something"

如果要显示,请使用 puts

puts(name) ----> same as here address is put in the arguments
于 2012-10-05T17:39:44.067 回答
0

不。

'H' 是字符文字。

“H”实际上是一个包含两个元素的字符数组,它们是 'H' 和终止的 '\0' 空字节。

于 2012-10-05T15:59:18.630 回答
0

puts正在等待作为输入字符串指针,因此它正在等待内存地址。但是在您的示例中,您提供了内存的内容,即*ptr. 这*ptr是内存的内容,地址ptrh

ptr是内存地址

*ptr是这段记忆的内容

puts 的输入参数是地址类型,但您提供了char类型(地址的内容)

puts您给它作为输入的地址开始逐个字符开始打印,直到包含的内存0然后它停止打印

于 2012-10-05T16:03:43.510 回答