c拾遗-二级指针、数组内函数
创始人
2024-04-24 19:18:15

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没有被使用,那么这两个函数即便没有定义,但只要声明了函数原型,编译器也是不会报错的,
换句话说,数组内的两个函数只参与编译阶段,而不参与链接,所以只要有函数声明即可。

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

相关内容

热门资讯

学术怎能以“帽”取人 (来源:湖州日报)转自:湖州日报  孙琳  最近,一场高校学术打假风波在全网持续发酵。一位名叫“耿同...
老北市露天狂欢 本报讯 记者王月宏报道 5月23日晚,距球场数公里外的四百年街区——沈阳老北市景区,巨幅观赛大屏亮起...
“东北超”,开启“注意力经济”... 5月23日,首届“东北超”盛大启幕,球迷在沈阳人民广场“第二现场”观赛。 本报记者 王迪 摄 “东北...
创新是体验经济生命线 (来源:湖州日报)转自:湖州日报  随着新技术、新场景以及消费新业态不断涌现,如今体验经济成为繁荣消...
沈阳“海选”200名环境体验官... 本报讯 记者赫巍利报道 “没想到我也能为城市管理出一份力!”近日,沈阳市城市管理综合行政执法局创新推...