这个指针应该这样操作吗?基本C

Should this pointer be acting this way? Basic C

根据我的理解,pName 应该是一个指针,其值是 char name 的内存位置。
这意味着,当我在第二个 printf 语句中取消引用指针变量 pName 时,它应该只打印字符串 "Cameron"。但它没有!有人可以帮助这个菜鸟吗:)?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char name[] = "Cameron";
    char * pName = &name;

    printf("Printing string of characters: %s\n", name);
    printf("Dereferencing pointer and printing string: %s\n", *pName);
    printf("Printing pointer: %p\n", &name);
    printf("Printing pointer another way %p\n", pName);

    return 0;
}

pName是一个char*,一个指向char的指针。因此,当您执行 *pName 时,您会得到一个 char,它不是您可以使用 %s.

打印的字符串

而不是

char *pName = &name;

你需要:

char (*pName)[] = &name; // a pointer to an array of chars.

现在您的 dereference/printf 将按预期工作。

此外,格式 %p 要求参数的类型为 void*。因此,您需要在 printf 调用中将参数转换为 void*

7.21.6.1 The fprintf function:

p The argument shall be a pointer to void. The value of the pointer is converted to a sequence of printing characters, in an implementation-defined manner.

这个字符数组的声明

char name[] = "Cameron";

相当于下面的声明

char name[8] = { 'C', 'a', 'm', 'e', 'r', 'o', 'n', '[=11=]' };

也就是对象的类型namechar[8].

您可以使用 typedef

编写示例
typedef char T[8];

然后像

一样声明数组
T name = { 'C', 'a', 'm', 'e', 'r', 'o', 'n', '[=13=]' };

所以指向数组的指针的声明看起来像

T *pName = &name;

上面显示的 T 是 char[8]。因此,用别名代替它表示的类型,您将拥有

char ( *pName )[8] = name;

要输出你现在可以写的指针指向的字符串

printf("Dereferencing pointer and printing string: %s\n", *pName);

取消引用指针 *pName 给出数组的左值,该数组又隐式转换为指向其第一个元素的指针,类型为 char *。所以要使用转换说明符 %s 你应该提供一个 char *.

类型的表达式

至于这个声明

char * pName = &name;

当它不正确时,因为在左侧有一个 char * 类型的对象,而在右侧有一个 char ( * )[8] 类型的表达式并且没有隐式从一种类型到另一种类型的转换。

你可以写

char * pName = name;

正如上面所说,数组的左值被隐式转换为指向其第一个元素的指针,类型为 char *。你可以使用这个指针写

printf("Dereferencing pointer and printing string: %s\n", pName);

1.

char name[] = "Cameron";

char * pName = &name;

通过 pName 的初始化,name 已经衰减到指向数组 name 的第一个元素的指针,实际上 name[0].

因此,&name 是指向 8 个字符数组的指针,类型为 char (*)[8],而不是 char*。用char (*)[]赋值给char*是无效的。

这应该给了你一个诊断。永远不要忽略编译器警告。

使用:

char * pName = name;

相反。


2.

printf("Dereferencing pointer and printing string: %s\n", *pName);

%s 转换说明符需要 char * 类型的参数,而 pName 已经是。取消引用 pName 获得无效的 char

使用:

printf("Dereferencing pointer and printing string: %s\n", pName);

相反。


旁注:

为了符合标准 %p 应该有一个类型为 void* 的参数。