c拾遗-二级指针、数组内函数

1、c语言中二级指针

用途1:一般被用在多维数组的环境中,一个二级指针可以指向一个二维数组;
用途2:二级指针作为函数参数使用时,可以通过函数修改实参指针值的目的。

对于第二点用途的理解:
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");
  free(str);
}


上述代码的易错写法是什么样呢:

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");
}


结论:
指向指针的指针的作用: 当要修改实参指针的指向的时候,形参必须使用指向指针的指针。
当修改的是实参指针指向的内容时,则形参只需是指针即可


关于值传递:
指针传递参数本质上是值传递的方式,它所传递的是一个地址值。
值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,
即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。
值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。


2、数组内函数不参与连接
今天碰到一个很奇怪的问题,搞了半天,只把最后的发现记录一下。

struct TEST_TYPE stTest[] =
{
    {"first", first_func},
    {"seconde", second_func}
}

在该结构体数组中,引用了两个函数first_func和second_func
如果这个数组stTest没有被使用,那么这两个函数即便没有定义,但只要声明了函数原型,编译器也是不会报错的,
换句话说,数组内的两个函数只参与编译阶段,而不参与链接,所以只要有函数声明即可。

虽然在数组中引用了这两个函数,但是这个数组并没有被使用,所以出现了上面的现象,一旦这个数组被使用,那么在链接阶段就需要函数定义。

你可能感兴趣的:(C语言,c语言,算法,数据结构,指针,编译链接)