Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指针数组的混淆_C_Arrays_Pointers - Fatal编程技术网

C 指针数组的混淆

C 指针数组的混淆,c,arrays,pointers,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+

以下是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++;说?

我相信这个链接会对你有所帮助

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

如果您想使用数组表示法访问数组中的下一个,那么它看起来像[n++]n,表示您所在数组的当前索引。其中,将ptr分配给a将ptr设置为数组的第一个索引,并且可以增加指针。

Postfix increment++的优先级高于dereference*

因此,*ptr++被解释为*ptr++。正如您正确理解的那样,如果ptr是一个包含任何内容、值或指针的数组,则不允许使用ptr++

如果ptr是一个指针,那么*ptr++确实会递增指针,使其指向操作后的下一个值,并且此表达式将返回指针递增之前的当前指向值。有时确实会使用此表达式,例如用于复制内存区域,例如:

while (...) {
    *dest++ = *src++; // Copy the current element, then increment both pointers
}
*ptr++不一定会给你一个字符串——当且仅当ptr指向一个字符串时,它才会给你一个字符串。在这种情况下,不需要仅仅为了获取字符串而发布增量-*ptr就足够了这是为了另一个目的

例如,它ptr是一个指向字符串数组的指针,即指向achar的指针,即char**ptr,那么您可以这样打印所有字符串:

int i;
for (i = 0; i < N; ++i) {
    printf("%s\n",*ptr++); // '++' "jumps" to the next string
}
*ptr++被解析为*ptr++-将++运算符应用于ptr,然后取消对结果的引用

如前所述,这会导致约束冲突-ptr是指向char的指针数组,数组类型的表达式是不可修改的左值,因此可能不是赋值的目标或++和-运算符的操作数

线路

printf("%s\n",*ptr++);
实际上,必须导致编译器以增量中的无效左值或类似于这些行的顺序发出诊断

1号:

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

错误:递增操作数需要左值…为什么不能使用*ptr++?

您的问题不清楚。我觉得我不明白。你说数组名不能用作变量是什么意思?ptr是一个变量,也是一个数组的名称,我的意思是如果int*pa,a[5];不能使用像a=pa这样的表达式;或a++;请参阅里奇的《C编程语言》一书第99页可能的副本,谢谢您的回复。我的理解是ptr是指向ptr[0]地址的指针,所以*ptr==ptr[0],*ptr+1==ptr[1]等等。所以如果我们想得到字符串,似乎需要再次取消引用?关于*ptr==ptr[0]和*ptr+1==ptr[1]请注意分组。但在C语言中,字符串是以null结尾的字符数组。因此,如果取消对字符串的引用,实际上将获得第一个字符。具有char**ptr-这可能是一个字符串数组;那么*ptr或ptr[0]是第一个字符串,*ptr+1或ptr[1]是第二个字符串,依此类推**ptr或ptr[0][0]是第一个字符串的第一个字符,**ptr+1+2或ptr[1][2]是第二个字符串的第三个字符,依此类推。是的,你说得对,有一个错误:当我使用*ptr++时,需要左值作为增量操作数。我在下面列出了所有可能的解决方案。如果你有时间,可以帮我看看吗。谢谢
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]);
}
void main(void)
{
    int i;
    char *ptr[3]={"how","are","you"};
    printf("%s\n",*ptr++);
}