0

我有一些关于在程序中使用数组指针的问题。当我使用一些数组名称时(这是指向第一个数组元素的 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

4 回答 4

1

您不能更改 const 指针。

实际上,在函数中,您只需更改一个非常量指针,该指针与您的 const 点具有相同的值(调用函数时按值传递)。

于 2013-09-12T20:20:09.670 回答
1

charTab是一个数组;charPtr并且tabToMove是指针。如果您能够更改charTab,您实际上会忘记数组的开头在哪里。如果你改变了charPtr或者tabToMove你没有同样的问题——它们是指向数组开头的指针的副本。

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

它不是一个常量指针——你已经将它声明为char *.

于 2013-09-12T19:15:05.940 回答
1

必须牢记数组名称和指针之间的一个区别。指针是一个变量,所以pa=apa++是合法的。但是数组名不是变量;类似的建筑a=paa++非法的。这pa是指针。

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

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

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

于 2013-09-12T19:19:26.327 回答
1

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

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

现在,函数不能直接接收数组作为参数(即使您在函数签名中写入数组,它也会被隐式解释为指针),因此,当您将数组传递给函数时,它肯定会衰减为指向其第一个元素的指针,并且它用于初始化函数的参数,然后可以根据需要递增:实际上,参数 tabToMove只是一个类型的局部变量,char *它使用传递的参数进行初始化,即指向数组第一个元素的指针。

换句话说,如果你写

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

就像你在做

char foo[]="asdasdas";
char *tabToMove=foo;
int noToMove=5;
CharTabMove(tabToMove, noToMove);
于 2013-09-12T19:21:16.257 回答