关于数组指针增量的疑问

时间:2014-07-17 17:20:32

标签: c pointers

我在这里获得输出' bcde'但是因为' a'是一个常量数组指针,它不应该在fun()内增加吗?那么为什么允许这里呢?

    void fun(char a[])
    {
     a++;
     printf("%s",a);
    }

    void main()
    {
     char a[]="abcde";
     fun(a);
    }

4 个答案:

答案 0 :(得分:3)

当您将数组传递给C中的函数时,数组会“衰减”为指针。换句话说,可以像这样声明等效函数:

void fun(char *a)

现在函数内部的代码非常有意义:指针递增,所以当结果传递给printf时,从第二个字母开始打印原始字符串。

答案 1 :(得分:2)

当您将数组名称传递给函数时,您将指针传递给它的第一个元素。

void fun(char a[])  // a is not an array of char

相当于

void fun(char *a)   

您可以在函数内部修改a,因为它不是数组名称,而是指向char的指针。
您无法修改a中的main,因为它被声明为数组。数组名称是不可修改的l值。

答案 2 :(得分:1)

当您处于函数参数中时,char a[]的处理方式与编写char *a完全相同。

答案 3 :(得分:1)

没有任何“常量数组指针”

在本声明中

char a[]="abcde";

声明了一个非const数组。您可以将其更改为例如

a[0] = 'A';

当您将数组作为参数传递给函数时,会使用从数组到类型char *的指针的转换,该指针指向数组的第一个元素。

此功能声明

void fun(char a[]);

相当于

void fun(char *a);

该参数与指针相邻。

因此,在函数内部,您可以更改指针本身及其指向的对象。例如

 a++;
 *a = 'B';

如果您希望在函数中不更改指针,可以将其声明为

void fun(char * const a);

在这种情况下,编译器会为语句

发出错误
 a++;

因为a确实是一个const指针。