Chinaunix首页 | 论坛 | 博客
  • 博客访问: 77391
  • 博文数量: 55
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 550
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-05 21:19
文章分类
文章存档

2011年(2)

2010年(2)

2009年(51)

我的朋友

分类: C/C++

2009-08-20 20:07:05

好,大家终于盼到我写技术型文章的时刻了。

//关于指针数组和二级指针
void func(int c, char **a)
{
        int n = 0;
        for(;n < c; n++)
                printf("%s", a[n]);
}
int main()
{
        char *a[3] = {"aaaaaaaaa", "bbbbbbb","c"};


        printf("%s, %s, %s\n", a[0], a[1], a[2]);
        func(3, a);
}

//
void func(int c, char a[3][10])
{
        int n = 0;
        for(;n < c; n++)
                printf("%s", a[n]);
}
int main()
{
        char a[3][10] = {"aaaaaaaaa", "bbbbbbb","c"};


        printf("%s, %s, %s\n", a[0], a[1], a[2]);
        func(3, a);
}
反正只有写成这样子才能正常运行。具体的,我有时间再分析。
测试程序如下,另外把gdb的输出贴过来,稍加分析。

void func_1(int c, char **a)
{
        int n = 0;
        for(;n < c; n++)
                printf("%s\t", a[n]);
        printf("\n");
}

void func_2(int c, char a[3][10])
{
        int n = 0;
        for(;n < c; n++)
                printf("%s\t", a[n]);
        printf("\n");
}
int main()
{
        char *a[3] = {"aaaaaaaaa", "bbbbbbb","c"};
        char b[3][10] = {"aaaaaaaaa", "bbbbbbb","c"};

        func_1(3, a);
        func_2(3, b);
}



(gdb) p a   //a为指针数组,a的元素都是指针
$8 = {0x804853e "aaaaaaaaa", 0x8048548 "bbbbbbb", 0x8048550 "c"}
(gdb) p &a 
$9 = (char *(*)[3]) 0xbf80e910
(gdb) p b   //b为数组,元素也是数组,不要问我指针和数组啥区别。。。反正在这就是由区别
$10 = {"aaaaaaaaa", "bbbbbbb\000\000", "c\000\000\000\000\000\000\000\000"}
(gdb) p &b
$11 = (char (*)[3][10]) 0xbf80e8f0

(gdb) p a  //进入第一个函数,入口参数是个指针,指向指针的指针
$12 = (char **) 0xbf80e910
(gdb) p a[0]
$13 = 0x804853e "aaaaaaaaa"


(gdb) p a  //进去第二个函数,函数入口是个指针,指向char [10]的数组
$14 = (char (*)[10]) 0xbf80e8f0
(gdb) p a[0]
$15 = "aaaaaaaaa"

结论,对于一级的指针和数组,我们经常是混着用的。不会有太大的差别,最大的区别,是在sizeof时的区别。
对于二级指针,又会有指针数组,和指向数组的指针,二者差别很大,建议慎用。


阅读(428) | 评论(0) | 转发(0) |
0

上一篇:木匠

下一篇:华丽丽的伤心事

给主人留下些什么吧!~~