在主程序或函数子例程中使用数组的差异

时间:2013-09-12 19:10:46

标签: c++ c arrays pointers

我对在程序中使用数组指针有一些疑问。 当我使用一些数组名称(这是一个指向第一个数组元素的const指针)

char charTab[] = "ABCDEFGHIJKLMNOPRSTUWXYZ";    /* Basic data buffer */

char *charPtr = charTab;                        /* Assign */
charPtr += 3;                                   /* It's ok, now we point 4th element */
charTab += 3;                                   /* No, the lvalue required for '+' operand */

但是当我创建时,让我们说下面这个函数:

void CharTabMove(char *tabToMove, int noToMove);

定义

void CharTabMove(char *tabToMove, int noToMove)
{
    printf("-------IN FUNCTION---------\n");
    printf("It's pointing to %c\n", *tabToMove);
    tabToMove += noToMove;
    printf("Now it's pointing to %c\n", *tabToMove);
    printf("-------LEAVING FUNCTION---------\n");
    fflush(stdout);
}

该函数允许沿阵列移动此指针没有问题。当然,在离开函数后,指针仍将指向charTab的第一个元素,但为什么允许该函数移动常量指针? 感谢您的回复建议,我试图向我的11岁侄子解释:)

---几年后编辑---

好的,时间过去了,现在我明白为什么我的问题没有准确制定。我通过在传递函数之前和之后使用引用数组名称的术语const pointer来误导你。换句话说,问题归结为:

为什么不允许这样做:

char charTab[] = "ABCDEFGHIJKLMNOPRSTUWXYZ";    /* Basic data buffer */
charTab += 3;                                   /* No, the lvalue required for '+' operand */

虽然这是允许的:

char charTab[] = "ABCDEFGHIJKLMNOPRSTUWXYZ";    /* Basic data buffer */
void CharTabMove(char *tabToMove, int noToMove)
{
    tabToMove += noToMove;
}
CharTabMove(charTab)

答案是当我收集并完善你的所有答案时,charTab行为几乎就像常量指向数组的第一个元素一样,但实质上不是左值或指针语句,所以不允许进行关节手术。将它传递给函数时,这个几乎类似于第一个数组元素的常量指针将被转换为值并作为常规指针传递,因此可以在其上执行操作。

4 个答案:

答案 0 :(得分:1)

charTab是一个数组; charPtrtabToMove是指针。如果你能够改变charTab,你就会有效地忘记数组的开始位置。如果您更改charPtrtabToMove,则不会遇到同样的问题 - 它们是指向数组开头的指针的副本。

  

但为什么允许该函数移动常量指针?

它不是常量指针 - 您已将其声明为char *

答案 1 :(得分:1)

必须牢记数组名称和指针之间的一个区别。指针是变量,因此pa=apa++是合法的。但是数组名称不是 变量;像a=paa++这样的结构是非法的。这里pa是指针。

charPtr += 3; ==>这是允许的,因为这是指针,允许指针算术,你可以改变指针的位置。

charTab += 3; ==>这是非法的。你不应该改变阵列的位置。

tabToMove ==>是字符指针。你可以修改它。

答案 2 :(得分:1)

首先,数组的名称不是常量指针,它只是数组的名称;关键是几乎任何上下文中的数组衰减指向数组第一个元素的指针。

数组本身不能递增,但是,一旦它衰减到指向第一个元素的指针并且被赋值给某个指针变量,它就可以递增(第二步是基本的,因为,为了增加某些东西,你必须有一个左值。)

现在,函数不能直接接收数组作为参数(即使你在函数签名中写了一个数组,它被隐式地解释为指针),所以,当你将一个数组传递给一个函数时,它肯定会衰减到指向它的第一个指针元素,它用于初始化函数的参数,然后可以根据需要递增:事实上,参数 tabToMove只是{{1}类型的局部变量使用传递的参数初始化,即指向数组第一个元素的指针。

换句话说,如果你写

char *

就像你在做什么

char foo[]="asdasdas";
CharTabMove(foo, 5);

答案 3 :(得分:1)

您无法更改常量指针。

实际上,在函数中,你只需要改变一个非常量指针,该指针只有你的const点具有相同的值(在调用函数时通过值传递)。