混淆指针数组

时间:2018-03-21 16:07:44

标签: c arrays pointers

以下是C代码:

char *ptr[100];
printf("%s\n",*ptr++);

我的问题是:我们知道数组名称不是变量(Ritchie的书" C编程语言"第99页),所以如果我们定义

int *pa,a[5];

这是合法的:

pa = a; pa++;

虽然这是非法的:

a++;

这里char *ptr[100]定义了一个char指针数组,因此ptr表示数组的初始地址。对于上面的代码,如果*ptr++表示*(ptr++),则这是非法的,因为数组名称不能用作变量,而且它也没有意义,因为*(ptr++)仍然获取地址反对%s。但是,如果*ptr++表示(*ptr)++,它看起来也很奇怪......任何人都可以帮忙理解这一点吗?

以上是我的思考过程,我的问题是:*ptr++如何为代码printf("%s\n",*ptr++);提供一个字符串?

4 个答案:

答案 0 :(得分:1)

后缀增量++的优先级高于取消引用*

因此,*ptr++被解释为*(ptr++)。正如你已经弄清楚的那样,如果ptr++是一个数组(任何东西,值或指针),则不允许ptr

如果ptr是一个指针,那么*ptr++确实会增加指针(因此它将指向操作后的下一个值),此表达式将返回当前指向的值(在指针递增之前)。实际上有时使用这种表达,例如,用于复制存储区域,例如:

while (...) {
    *dest++ = *src++; // Copy the current element, then increment both pointers
}

*ptr++ 不一定会为您提供字符串 - 当且仅当ptr指向字符串时,它才会为您提供字符串。在这种情况下,没有必要仅仅为了获得字符串而后增量 - *ptr就足够了。 ++用于其他目的。

例如,它ptr是指向“数组”字符串的指针(即指向char指针的指针,即char **ptr ),然后你可以像这样打印所有字符串:

int i;
for (i = 0; i < N; ++i) {
    printf("%s\n",*ptr++); // '++' "jumps" to the next string
}

答案 1 :(得分:0)

我相信这个链接可以帮到你。

C/C++ int[] vs int* (pointers vs. array notation). What is the difference?

数组表示法具有边界限制,而指针表示法则没有。

如果你想用数组表示法访问数组中的下一个,它看起来像[n ++] n就像你所在的数组的当前索引一样。将ptr分配给一个ptr到数组的第一个索引,你可以增加一个指针。

答案 2 :(得分:0)

*ptr++被解析为*(ptr++) - 将++运算符应用于ptr,然后取消引用结果。

如上所述,这导致约束违规 - ptr是指向char的指针的数组,以及数组类型的表达式是不可修改的左值,因此可能不是++--运算符的赋值或操作数的目标。

该行

printf("%s\n",*ptr++);

应该(实际上,必须)导致编译器按照“无效左值增量”的顺序发出诊断或沿着这些行发布某些内容。

答案 3 :(得分:0)

没有。 1:

void main(void)
{
    int i;
    char *ptr[3]={"how","are","you"};
    for (i=0;i<3;i++)
        printf("%s\n",ptr[i]);
}

这打印出正确的答案。好!

2号:

void main(void)
{
    int i;
    char *ptr[3];
    *ptr[0] = "how";
    *ptr[1] = "are";
    *ptr[2] = "you";
    for (i=0;i<3;i++)
        printf("%s\n",ptr[i]);
}

警告:赋值在没有强制转换的情况下从指针生成整数[默认启用] .....为什么不能像这样初始化?

3号:

void main(void)
{
    int i;
    char *ptr[3]={"how","are","you"};
    printf("%s\n",*ptr++);
}

错误:左值作为增量操作数需要....为什么我们不能使用*ptr++