闲逛优快云的论坛
又学到了不少东西,下面贴出来
--------------------------------------------
#include <stdio.h>
void main()
{
char *a[3]={"Hello","Welcome","Goodbye"};
for(int i=0;i<3;i++)
{
a++;
printf("%s/n",*a);
}
}
上段程序编译错误,问题是a是一个指针数组,在对a进行自加操作的时候报错,是因为不能对数组名进行自加操作。而下一段代码却能够通过编译并且程序能运行。
#include <stdio.h>
void main(int argv,char *argc[])
{
while(argv>0)
{
argv--;
printf("%s/n",*argc);
argc++;
}
}
我有疑问,argc也是一个指针数组啊,但是这里为什么能对argc数组名进行自加操作呢?盼求高手解答,谢谢!
---------------------------------------------
下面是大家的解答(筛选出我认为有参考价值的)
---------------------------------------------
char *a[3]={"Hello","Welcome","Goodbye"};
相当于const char *a[3]={"Hello","Welcome","Goodbye"};
定义在程序的常量区的,不是栈上的!
=======================================
main(int argv,char *argc[])里的char *argc[]这里的指针并没有指向字符串常量,只是普通的压栈参数而已!
=======================================
数组, 在作为参数后,
会退化为一个普通的指针 ...
可以这样:
#include <stdio.h>
void print(char *a[]) //这里退化为指针了 ...
{
for(int i=0;i<3;i++)
{
a++;
printf("%s/n",*a);
}
}
void main()
{
char *a[3]={"Hello","Welcome","Goodbye"};
print(a);
}
你的第二个例子也是同样的道理 ...
====================================
1 数组名是个常量 代表数组首地址 不能改变 a++改变了
所以报错
2当数组作为函数参数 就是一个完完全全的指针 char *a[]等价于char **a
====================================
--------------------------------------------
char *a[3]={"Hello","Welcome","Goodbye"};
--------------------------------------------
a实际上是一个指针常量,编译就可以确定的嘛.
--------------------------------------------
void main(int argv,char *argc[])
--------------------------------------------
函数的数组参数就不同了,无法知道数组有多大,而且用拷贝方式传递数组参数效率不行,只好把把argc处理成指针变量.
----------------------------------------------
#include <iostream>
using namespace std;
int main()
{
char *a[]={"Hello","Welcome","Goodbye"};
for(char **p = a;p != a + 3;++p)
{
cout << *p << endl;
}
system("pause");
return 0;
}
char *a[] 是字符串数组,a是数组名,存放指向a[0]的地址,不可改变
**p是字符串指针,指向a,可改变
如果按照上面说得
#include <stdio.h>
void print(char *a[]) //这里退化为指针了 ...
{
for(int i=0;i<3;i++)
{
a++;
printf("%s/n",*a);
}
}
void main()
{
char *a[3]={"Hello","Welcome","Goodbye"};
print(a);
}
此时*a[]作为形参,成为了一个字符串指针,跟**p有同样的作用,而跟原先的*a[]有了本质的不同
本文探讨了C语言中指针数组的使用差异,解释了为何某些情况下不能对指针数组名进行自增操作,而在特定场景下却可以,并通过代码示例详细说明了其原因。

被折叠的 条评论
为什么被折叠?



