这个指针应该这样操作吗?基本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=]' };
也就是对象的类型name
是char[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*
的参数。
根据我的理解,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=]' };
也就是对象的类型name
是char[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*
的参数。