指针数组的问题

本文探讨了C语言中指针数组的使用差异,解释了为何某些情况下不能对指针数组名进行自增操作,而在特定场景下却可以,并通过代码示例详细说明了其原因。

闲逛优快云的论坛

又学到了不少东西,下面贴出来 

--------------------------------------------

#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[]有了本质的不同

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值