指针数组和数组指针

来源:互联网 发布:node.js和python 编辑:程序博客网 时间:2024/06/05 20:02

该文时自己对指针数组用法的一点总结,还望高手指点不足原文如下

由于以前对指针数组不太明白,所以自己写了 一个小的测试程序来验证了自己的猜测,先总结如下;

指针数组,由名字就可以知道的该数组中的成员都是为指针的。其定义的方法为:
char *p[5] = {NULL};
该初定义一个包含5个char*类型的数组的指针,由于p本身也是一个指针,所以该处还可以理解为指向p是一个指向字符型指针的指针。并且该处将其中的的成员赋值为NULL性。
2,访问成员
其中对于指针数组的成员的访问和访问其它的双重指针的成员类似例如:p表示的是第一个成员的地址和p[0]一样即为初始值地址,*(p+1)即表示第一个成员的值。下面是一个例子:
 void main()
{
    char *p1[3]= {0};
    char *p2[3]= {"yang","bbbb","ccc"};
    //其中p2表示为其初始化值
    for(i=0;i<3;i++)
    {
       printf("%s\r\n",*(p1+i));//该项打印出各个成员的值
         printf("%d\r\n",p1+i); //该项打印出各个成员的地址
    }
   text(p2);
}
3,怎么当做参数传递
void text(char*c[],int n)
{
   for(i=0;i<n;i++)
    {
       printf("%s\r\n",*(p2+i));//该项打印出各个成员的值
         printf("%d\r\n",p2+i); //该项打印出各个成员的地址
    }
};
在声明函数的时候其中的形参的类型要声明为指针数组的类型的形式即可;当然你还可以为其分配空间,不过要记得在用完后腰释放啊。
4,可以在调用的函数中对其进行内存分配并且在调用函数中对其进行释放如下所示
void test_1(char *c[],int i)
{
   char *ch ="haohaohao";
   int temp= 0;
  if(*(c+i) == NULL )
{
   *(c+i) = malloc(strlen(ch)+1);
   if(*(c+i) != NULL)
    {
   tp_os_mem_set(*(c+i),0,strlen(ch)+1);
   tp_os_mem_cpy(*(c+i),ch,strlen(ch));
    }
}
   temp=  strlen(*(c+i));
    printf("%s\r\n",*(c+i));
}
该函数是对其进行内存分配并且赋值进行操作
void main()
{
   int i = 0;
    char *p1[3]= {0};
   test_1(p1,0);
   test_1(p1,1);
   test_1(p1,2);
   // test_1(p2);
     for(i=0;i<3;i++)
{
   printf("i=%s\r\n",*(p1+i));
   printf("i=%0x\r\n",p1+i);
}
     for(i=0;i<3;i++)
{
   if(*(p1+i) != NULL)
   {
     tp_os_mem_free(*(p1+i));
  *(p1+i)= NULL;
   }
}
  for(i=0;i<3;i++)
{
   printf("i=%s\r\n",*(p1+i));
}
}
在该函数中对其赋值函数调用,并释放已经分配的堆空间。
5,数组指针 
声明的形式为.char(*p)[10];
其实上面的定义也就是相当于定义了一个二维数组,具体的用法这里就不再列举了,大家可以仿照访问二维数组的的方法,来访问数组指针。