C中字符串的数组和指针表示法的区别 #包括 内部主(空) { char heart[]=“我爱蒂莉”/*使用数组表示法*/ int i; 首先,对于(i=0;i

C中字符串的数组和指针表示法的区别 #包括 内部主(空) { char heart[]=“我爱蒂莉”/*使用数组表示法*/ int i; 首先,对于(i=0;i,c,arrays,string,pointers,C,Arrays,String,Pointers,应该是 #include<stdio.h> int main(void) { char heart[]="I Love Tillie"; /* using array notation */ int i; for (i=0;i<6;i++) { printf("%c",&heart[i]); /* %c expects the address of the character we want to print */ } return 0

应该是

#include<stdio.h>
int main(void)
{

 char heart[]="I Love Tillie"; /* using array notation */

 int i;
 for (i=0;i<6;i++)
 {
   printf("%c",&heart[i]);  /* %c expects the address of the character we want to print     */
 }

 return 0;

而不是

printf("%p",&heart[i]); // if you want to print the charachter address in the memory
heart
是一个字符数组,
heart[i]
是数组中的字符编号
i

&heart[i]
heart
数组中元素编号
i
的内存地址。要打印内存地址,首先必须使用
%p

应该是

#include<stdio.h>
int main(void)
{

 char heart[]="I Love Tillie"; /* using array notation */

 int i;
 for (i=0;i<6;i++)
 {
   printf("%c",&heart[i]);  /* %c expects the address of the character we want to print     */
 }

 return 0;

而不是

printf("%p",&heart[i]); // if you want to print the charachter address in the memory
heart
是一个字符数组,
heart[i]
是数组中的字符编号
i


&heart[i]
heart
数组中元素编号
i
的内存地址。要打印内存地址,您必须使用
“%p”
,您试图将地址打印为单个字符;这是个坏消息

heart[i]
是一个字符;
heart[i]
是该字符的地址。它们根本不是一回事

尝试这样的循环:

printf("%c",&heart[i])
(i=0;i<6;i++)的

{
printf(“%c”,心脏[i]);
printf(“:%s\n”,&heart[i]);
}

看看不同的转换规范(和参数类型)有什么不同。如果愿意,可以在循环的开头添加一个
printf(“%p”,(void*)&heart[i]);
,以查看地址值在循环过程中如何变化。

您正试图将地址打印为单个字符;这是个坏消息

heart[i]
是一个字符;
heart[i]
是该字符的地址。它们根本不是一回事

尝试这样的循环:

printf("%c",&heart[i])
(i=0;i<6;i++)的

{
printf(“%c”,心脏[i]);
printf(“:%s\n”,&heart[i]);
}

看看不同的转换规范(和参数类型)有什么不同。如果您愿意,您可以在循环的开头添加一个
printf(“%p”,(void*)和heart[i]);
来查看地址值在循环中的变化。

您在哪里读到的
heart[i]
和heart[i]相同
?它们的意思不一样。字符数组的名称与任何数组名称一样,产生数组第一个元素的地址。因此,以下内容适用于数组m1:m1=&m1[0]、*m1='L',和*(m1+1)==m1[1]=='i'来自C Primer Plus-STephen Prata,这也让我感到困惑。是什么让你认为
char
与char的地址(
char*
)是一样的?是不是?你误读了等价物。显然,数组是
char m1[]=“Like”
或类似的东西。说
m1=&m1[0]
是准确的。说
*m1=='L'
相当于说
m1[0]='L'
,给定我显示的初始化是准确的。同样地,
*(m1+1)=='I'
m1[1]='I'
是单独准确的,但复合语句
*(m1+1)==m1[1]=='i'
在C中的计算结果不是真的,尽管松散地说是有意义的。你在哪里读到的
心[i]
心[i]是一样的
?它们的意思不一样。字符数组的名称与任何数组名称一样,产生数组第一个元素的地址。因此,以下内容适用于数组m1:m1=&m1[0]、*m1='L',和*(m1+1)==m1[1]=='i'来自C Primer Plus-STephen Prata,这也让我感到困惑。是什么让你认为
char
与char的地址(
char*
)是一样的?是不是?你误读了等价物。显然,数组是
char m1[]=“Like”
或类似的东西。说
m1=&m1[0]
是准确的。说
*m1=='L'
相当于说
m1[0]='L'
,给定我显示的初始化是准确的。同样地,
*(m1+1)=='I'
m1[1]='I'
是单独准确的,但复合语句
*(m1+1)==m1[1]=='i'
在C中的计算结果不是真的,尽管从广义上讲它是有意义的。是的,
%p
会起作用;当然,它会做一个完全不同的工作。
%p
将打印地址;
%s
将打印子字符串。在这两个字符串中,子字符串对OP来说可能更有趣,但您可以添加一个
printf(“%p\n”,(void*)和heart[i]);
到信息打印操作列表。@MarounMaroun:
%p
也需要
(void*)
castYes,
%p
会起作用;当然,它会做一个完全不同的工作。
%p
将打印地址;
%s
将打印子字符串。在这两个字符串中,子字符串可能对OP更感兴趣,但您可以添加一个
printf(“%p\n”,(void*)&heart[i]);
到信息打印操作列表。@marounnaroun:
%p
还需要
(void*)
强制转换