字符数组和指针的基本混淆
Posted
技术标签:
【中文标题】字符数组和指针的基本混淆【英文标题】:character arrays and pointers basic confusion 【发布时间】:2015-06-15 09:26:23 【问题描述】:我是指针的初学者。完成整数数组和指针后,我转移到字符数组和指针。我期待相同的结果,但它很奇怪。
int main()
char chararray[20]="Char Array";
void printarray(char *);
void printarraydirect(char * );
printf("Passing chararray to funtion printarray\n");
printarray(chararray);
printf("Printing directly as c in printarraydirect function");
printarraydirect(chararray);
return 0;
void printarray(char *c)
int i=0;
//while(c[i]!= ' ')-----------------------> checks for empty space
while(c[i]!='\0')
printf("%c",c[i]);
i++;
printf("\n");
void printarraydirect(char * c)
printf("Printing c-------------->");
printf("%s\n",c);
int i=0;
printf("Printing c[i]-------------->\n");
// shows error here , if so why didnt it show me error in printarray function. and why didnt it print the whole array when printed c in printarray function..
printf("%s\n" c[i]);
【问题讨论】:
printf("%s\n" c[i]);
与printf("%c",c[i]);
不同
最后一行必须是printf("%c\n" c[i]);
,因为它只有一个字符。
请不要在 main func 中声明原型。
另请注意,您无需为chararray
指定长度20
(如果您将[]
留空,编译器会根据您初始化它的字符串文字设置长度)。
并且注释掉的while(c[i] != ' ')
是不正确的,除非函数有一个前提条件是字符串必须包含一个空格;如果传递了一个没有空格的字符串,这将超出字符串的末尾。
【参考方案1】:
首先,printf("%s\n" c[i]);
行中缺少一个逗号。其次,c[i]
是单个 char
(数组的元素类型),因此 %s
格式不正确 - 打印单个字符应该是 %c
。或者,如果您希望从该点开始打印整个字符串,则需要传递该元素的地址 (&c[i]
),但在这种情况下,它与 c
相同,因为 i
为零。
【讨论】:
对那边的错误感到抱歉。考虑一个 int 数组, int a[5];int *p=a;然后 a[i] 和 *(a+i) 将返回值, &a[i] 和 a+i 将返回地址。如果是这样,那么在我的情况下,为什么不打印 c 只返回第一个字符的地址但它返回整个数组。【参考方案2】:基本上%s
格式说明符期望将地址打印到输出流并打印直到找到 NULL 字符 (\0
)。在这里,当您简单地给出c
时,数组的基地址作为参数传递。但是当你给c[i]
时,它是位于位置(基地址+索引)的值,即addressOf(c)+ valueOf(i)。
【讨论】:
那么在printarraydirect中打印每个字符的地址的方法是什么?? 如果你想打印每个字符的“地址”,那么你应该使用“for”循环并且 printf 函数应该像 (printf("%d", &c[i]) )。这将打印每个字符的地址。你也可以使用 long double 格式说明符。 感谢 Tamil selvan.in c++,如果我打印 &a[0] 它会打印字符数组,如果我打印 &a[2] 它会打印 ar 数组,为什么会这样?以及在 c++ 中如何打印地址?? @Jagdeesh 我不明白你在问什么?你能详细说明一下吗?以上是关于字符数组和指针的基本混淆的主要内容,如果未能解决你的问题,请参考以下文章
C 语言数组与指针操作 ( 数组符号 [] 与 指针 * 符号 的 联系 与 区别 | 数组符号 [] 与 指针 * 符号 使用效果 基本等价 | 数组首地址 与 指针 本质区别 )