好,大家终于盼到我写技术型文章的时刻了。
//关于指针数组和二级指针
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时的区别。
对于二级指针,又会有指针数组,和指向数组的指针,二者差别很大,建议慎用。
阅读(437) | 评论(0) | 转发(0) |