以下是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++);
提供一个字符串?
答案 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++
?