澄清C中的char指针

ret*_*dev 6 c pointers character-arrays

我正在研究K&R第二版,第5章.

在页87,引入字符数组的指针如下:

char *pmessage;
pmessage = "Now is the time";
Run Code Online (Sandbox Code Playgroud)

如何知道这pmessage是一个指向字符数组的指针,而不是指向单个字符的指针?

要扩展,请在第94页上定义以下函数:

/* month_name: return the name of the n-th month */
char *month_name(int n)
{
    static char *name[] = {
        "Illegal month",
        "January", "February", "March",
        ...
    };

    return (n < 1 || n > 12) ? name[0] : name[n];
}
Run Code Online (Sandbox Code Playgroud)

如果只提供了上面的函数声明,那么如何知道是返回单个字符还是字符数组?

如果假设返回来自month_name()一个字符数组并迭代它直到NULL遇到一个,但返回实际上是一个字符,那么是否有可能出现分段错误?

有人可以演示一个指向单个字符与字符数组的指针的声明和赋值,它们对函数的使用以及已经返回的标识?

Joh*_*ode 1

如何知道 pmessage 是指向字符数组的指针,而不是指向单个字符的指针?

你不知道。至少,无法从指针值本身判断它是否指向单个元素char或 数组的第一个元素char。无论哪种方式都可以使用。

您必须依赖上下文或明确指定如何使用指针。例如,scanf使用不同的转换说明符来确定指针是否指向单个char

char single_char;
scanf( " %c", &single_char );
Run Code Online (Sandbox Code Playgroud)

或数组char

char array_of_char[N];
scanf( "%s", &array_of_char[0] );
Run Code Online (Sandbox Code Playgroud)

请记住,当它不是 thesizeof或一元&运算符的操作数或用于在声明中初始化另一个数组的字符串文字时,“N 元素数组T”类型的表达式将被转换(“衰减”)为表达式“指向T”的指针,表达式的值将是数组第一个元素的地址,因此最后一行也可以写成

scanf( "%s", array_of_char );
Run Code Online (Sandbox Code Playgroud)

由于该转换规则,每当将数组表达式传递给函数时,函数实际接收到的都是指针值。事实上,函数声明

void foo( char str[N] );
Run Code Online (Sandbox Code Playgroud)

void foo( char str[] );
Run Code Online (Sandbox Code Playgroud)

相当于

void foo( char *str );
Run Code Online (Sandbox Code Playgroud)

所有三个都被视为str指向 的指针char