指针的指针

主要两个用途

1)用于改变单个指针变量的值, 通常在调用函数里malloc赋值该指针,在调用函数外free该指针。

 int change_point( char** errMsg);

{

   *errMsg=(char*)malloc(100)

  strcpy(*errMsg,"error test!");

}

char    *zErr ;

change_point(&zErr);

printf("%s\n",zErr);

free(zErr) ;

2)用于改变指针数组变量的值,传递指针数组作为形参传下来

 例如 int main(int argc,char *argv[])  = int main(int argc,char **argv) ,argc参数个数,argv指针数组


int lookup_keyword(char *desire_word,char **keytable,int size) //char *keytable[],因为keytable[]可写成指针形式 故= char **keytable
{
    char **kwp = NULL;
    for(kwp=keytable;kwp<keytable+size;kwp++)
    {
        if(strcmp(desire_word,*kwp)==0)
        {
            return kwp-keytable;
        }
    }
    return -1;
}
 
int main()
{
    char **key = NULL;
 
    char *keyword[] = { //该例中 keyword必须定义为指针数组,每个元素指向字符串常量
    "hello",
    "nice",
    "eat"
    };
 
    key = keyword; //二级指针 = 字符指针数组首元素地址(类型为char * *类型一致)
 
    int i = lookup_keyword("eat",keyword,3);
    printf("i=%d\n",i);
    return 0;
}
 

 理解方法:

例如 int *p --表示一个指针,该指针指向的是int变量,可通过函数传递该指针来改变变量值(该变量为int类型)。

同理 int **p --表示一个指针,该指针指向的是指针变量,可通过函数传递该指针来改变变量值(该变量为指针类型)。

 

如果你想改变一个指针本事的内容,可通过定义一个指针的指针来实现。

 

 

以下是经典程序(载自林锐的从c/c++高质量编程),讲解的部分是我个人理解

void GetMemory(char *p,int num)
{
p=(char*)malloc(sizeof(char)*num);       //p是形参指向的地址
}
void main()
{
char *str=NULL;
GetMemory(str,100);                            //str是实参指向的地址,不能通过调用函数来申请内存
strcpy(str,"hello");
}

结构是编译能通过,却不能运行,为什么呢?

先说一下指针作为函数参数的意义:当将指针作为参数时,实参向形参传递的是地址,在函数执行过程中,既可以对该参数指针进行处理,也可以对该参数指针所指向的数据进行处理,(以上程序段来说就是可以对p或*p进行处理)。由于此时形参和实参都是指向同一个存储单元,因此当形参指针所指向的数据改变时,实参指针所指向的数据也作相应的改变,因此这时的形参可以作为输出参数使用。

按照上面的说法,这个程序应该没有问题的啊,实参str和形参p指向同一个存储单元,给形参分配的内存单元应该也给实参分配了才对啊,问题就是在这里

实参和形参是指向同一个地址,它们只是指向相同,但它们自身的地址不是同时申请的,就是说p在申请内存时,str并不可以通过调用Getmemory同时申请内存,所以尽管str调用了GetMemory,但它仍然是个空指针,所以进行strcpy是就不能运行。

要使程序可以运行,只要小小的改动就行了(用指向指针的指针):

void GetMemory(char **p,int num)
{
*p=(char*)malloc(sizeof(char)*num);       //此时*p就变成了是形参本身的地址
}
void main()
{
char *str=NULL;
GetMemory(&str,100);                            //&str是实参的地址,所以实参和形参之间就可以直接调用
strcpy(str,"hello");
free(str);  

程序就会如你所愿,输出hello了。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值