【发布时间】:2021-03-15 12:34:09
【问题描述】:
我将 b 定义为指向字符串的指针:
char a[] = "hello";
char *b;
strcpy(&b, a);
到目前为止一切都很好(虽然我不太明白为什么 b=&a 不起作用,考虑到 a 和 b 都是指针)。
现在当我想打印 b 指向的字符串时,我必须使用 &b:
printf("%s", &b);
为什么我需要给出一个指向 printf() 的指针的地址,以便打印该指针指向的变量的内容?为什么 printf("%s", *b) 不起作用?
将此与指向整数的指针的语法进行对比:
int c = 5;
int *d;
d = &c;
printf("%d\n", *d);
说得通。
我知道字符串语法在某种意义上是不同的,字符串名称也是一个指针。不知道我明白为什么需要这种特殊的字符串规则,但是很好,在我的头撞到墙上几次之后,我强迫学习了这一点。但是 printf("%s", &b),真的吗?
我可以将此作为“规则”来学习,但是如果有人帮助我理解它,我将不胜感激。
【问题讨论】:
-
您的第一个 sn-p 不正确。
b已经是一个指针。使用&b导致指向指针的指针不是strcpy所期望的。这将导致未定义的行为。您在printf中使用&b的进一步示例也是错误的,并且是第一个错误的结果。 -
编译器认为
strcpy(&b, a);不正确:警告 C4047:'function':'char *' 与 'char **' 的间接级别不同。printf("%s", &b);的类似警告,你需要printf("%s", b)两个函数都需要一个指针,来自char *b;的b是。 -
@WeatherVane 的评论有点误导。
&b也是一个指针,所以仅仅说“两个函数都需要一个指针”是奇怪的。问题是&b是错误类型的指针。&b是char **,strcpy 期望第一个参数的类型为char * -
感谢 cmets!如果我写的是
而不是 ,编译器如何知道 b 是单个字符还是指向字符串的指针。只有在我初始化b之后它才会弄清楚吗?将 b 指向字符串 a 并使用 b 作为 printf() 的参数打印该字符串的正确代码是什么? -
@CyberSinke 声明
char b已经告诉编译器b是基本数据类型char的变量。不,它(编译器)会在到达char b;行时立即计算出来。 正确代码:char *b = a;,然后是printf("%s", b);。 :-)
标签: c string pointers syntax ampersand