字符数组和指针的基本混淆

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语言指针进阶第三站,数组指针!

char*s与chars[]

深入 char

C 语言数组与指针操作 ( 数组符号 [] 与 指针 * 符号 的 联系 与 区别 | 数组符号 [] 与 指针 * 符号 使用效果 基本等价 | 数组首地址 与 指针 本质区别 )

C语言复习之字符指针(迭代内存申请等操作)

C语言提高内容目录