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

Posted Nerazzur

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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");

对于上面的例子,如果GetMemory函数使用返回值的方式返回指针,则就不需要二级指针,普通指针就可以实现了。


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


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


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

struct TEST_TYPE stTest[] =

    "first", first_func,
    "seconde", second_func

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

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

以上是关于c拾遗-二级指针数组内函数的主要内容,如果未能解决你的问题,请参考以下文章

C/C++中二级指针传递参数个人遇到内存值发生改变现象的记录及相关修正方法

C/C++中二级指针传递参数个人遇到内存值发生改变现象的记录及相关修正方法

C 语言二级指针作为输入 ( 指针数组 | 将 二级指针 作为函数输入 | 抽象函数业务逻辑 )

C语言编程题目3(二级c)请编写一个函数,统计在tt 字符串中“a”到“z”26 个字母各自出现的次数,并依次存放在 cc所指数组中。

C 语言二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一二 模型数据拷贝到 三 模型中 并 排序 )

C 语言二级指针作为输入 ( 二维数组 | 抽象业务函数 | 二维数组打印函数 | 二维数组排序函数 )