这是道哥的第013篇原创 前言 今天同事问了一个问题:在函数参数中传递指针的指针,很常用的一个场景,重新梳理一下记录于此,以后如果有类似的问题直接发这篇小总结就可以了。...分析原因 我们可以把char*类型的指针看成一个遥控器,如果给这个指针赋值,就相当于把这个遥控器与一个设备进行绑定,可以通过遥控器来控制这个设备。...执行do_work(pData, 128); 这里传递的参数是pData本身,所以进入void do_work(char *p, int size)函数之后,实参pData的内容就赋值给形参p,所以指针...执行do_malloc(&pData, 128); 把pData指针的地址作为实参进行传递,因为pData本身就是一个指针,加上取地址符&,就是指针的指针(二级指针),因此do_malloc函数的第一个参数就要定义成...p此时是一个二级指针,参数赋值之后,p里面的内容就变成了pData这个指针变量的地址,也就是说p指向了pData这个变量。
在C中,我们只了解到有两种传参方式,一种是值传递,另外一种是传递指针,一般情况下我们选择使用指针传递参数。在C++中,又新增了一种传参方式,那就是引用(type &),引用传参给我们带来了更好的体验。...2、指针传递 指针则解决了上面的两个问题,首先指针在32位系统下(64位系统是8字节)只有4个字节,无论数据多大,只要你将其指针传递给传输在压栈过程中只需要压一个4个字节的指针。...在传递给函数时相当于包装了原变量指针的地址传递给函数,可以理解为在函数中直接使用原变量进行操作,而且这个期间不会出现拷贝的行为。引用的本质是指针,C++对裸露的内存地址(指针)作了一次包装。...int tmp = ra; ra = rb; rb = tmp; } int main(int argc, char* argv[]) { int x = 10; int y = 20; // 传指针...// swap(&x, &y); // 传引用 swap(x, y); cout << x << “–” << y << endl; getchar(); return 0; }
在一次稀疏矩阵压缩算法中,为了保证压缩函数可复用性,使用了void** 作为压缩形参,结果二维数组传入一直无法获取到内容。...结果出现的方案如下 方法1 方法2: 数组指针 或者是 二级指针 结果相同 int ** arr; 上述两种情况指针步长都会是一个int* 的大小,也就是4个字节 ,这个可以从第二章图,13630500
【进阶指针一】字符指针&指针数组&数组指针 https://blog.csdn.net/qq_64428099/article/details/125011487 目录 1.数组传参 1-2 二维数组传参... 2 指针传参 2-1 一级指针传参 2-2 二级指针传参 2-3 关于传&arr和arr 3 函数指针 3-1 函数指针的引入 3-2 函数指针的脱裤子放屁使用【先见一见基本操作】 3-3 试图看懂大佬写的代码... 4 函数指针数组 4-1函数指针数组的引入和基本使用 4-2 函数指针数组的妙用 ---- 1.数组传参 1-1一维数组传参 正向:实参给定,猜猜看形参可以怎么写?...对于多维数组定义或者传参时,只有第一维数组的数组元素可以省略,其余维必须写上,且必须写对!!! 2 指针传参 反向:形参给定,猜猜看实参可以怎么写?...2-1 一级指针传参 void test1(int* ptr)//一级指针:存放普通变量的地址 { //... } int main() { int a = 10; int* p = &a;
前面说到,将指针作为参数传入,在函数内部对指针进行修改,函数结束后指针的修改将被保留。 因为指针传参代表着地址传参。 本篇解惑:如何让对指针参数的修改不被保存。...原因很简单,pNode->next也是一个映射地址,这句话的意思就是用一个新的地址映射,顶替掉那个旧的,使得指针pNode指向一块新的地址,和the_head失去联系。
第一种形参为二维数组 声明 void function(int a[m][n]);//函数声明 void function(int a[][n]);//不论多少维数组,第一维都可省略。...第二种形参为数组指针 (其实只是 声明定义 与第一种不同,其他一样) 声明 void function(int (*a)[n]); //不是(int *a[n])(指针数组) ,而是(int (*a)...第三种形参为二级指针 声明 void function(int **a,int n);n表示第二维数组长度,即列宽 调用 function( (int **)a,int n);//实参不能为数组名!...二维数组,数组指针,二级指针。(都是指针) 调用(一对一,二对二) 数组指针,二维数组就写一级指针即 数组名....二级指针就写二级指针即 (int**)数组名 在函数中操作元素(注意二级指针,只能用最后的方法) *(a[i] + j) //代表第 i 行 第 j 列 *( *(a+i) + j) //同上 *(
- 个人主页:秦苒& ❄专栏传送门:《C语言》 指尖燃热血,代码铸锋芒;以信仰破局,向顶峰生长 秦苒&的简介: 前言: 提示:以下是本篇文章正文内容,下面案例可供参考...也就是说二维数组传参本质上也是传递了地址,传递的是第一行这个一维数组的地址,那么形参也是可以写成指针形式的。...如下图所示: 于是,我们得到结论: 二维数组传参,形参的部分可以写成数组,也可以写成指针形式 三、函数指针变量 3.1 函数指针变量的创建 什么是函数指针变量呢 函数指针变量就是用来存放函数地址的...围绕C语言中数组指针、函数指针相关的核心知识点展开系统讲解,从基础概念到实际应用,层层拆解了指针体系中这两类易混淆的重要内容,清晰梳理了其定义、 结尾 勇敢的寻宝者啊,这次旅途你挖掘到多少宝藏呢,苒苒很期待下次与您相遇...结语:希望对寻找C语言相关内容的寻宝者有所帮助,不要忘记给博主“一键三连”哦!你的每一次鼓励都为我提供 了前行的动力! 小喵很期待与你再次寻宝奥 ᰔᩚ/•᷅•᷄\୭
但数组作为参数传递给函数,不同于普通的变量传参,本篇博客将详细介绍数组传参的规则和实际用法 二、数组传参规则 数组传参,形参是不会创建新的数组的。 形参操作的数组和实参的数组是同⼀个数组 1....数组传参的实参传递 数组名作为实参传递 ,在通常情况下数组名就是首元素的地址。...数组传参的形参接收 2.1 数组传参使用数组名作为形参接收 形参如果是⼀维数组 数组大小可以省略不写,但是数组作为形参,后面的 [ ] 不可以省略 比如可以写成arr[ ] 或者arr[8] #include...sizeof(arr) / sizeof(arr[0]);//计算数组元素的行数 print(arr, sz); set(arr, sz); print(arr, sz); } 2.2 数组传参使用指针作为形参接收...形参使用指针接收之后,得到的是一个数组首元素的地址 得到数组首元素地址之后,就可以对数组任意元素进行操作 #include void set(int* arr,int sz) //将数组所有元素置为
前言 C语言里函数是非常重要的知识点,一个完整的C语言程序就是由主函数和各个子函数组成的,主函数调用子函数完成各个逻辑功能。 2. 函数在C语言里是什么概念?...C语言程序里除了main函数(主)之外的函数都叫子函数,都属于自定义函数。 3. 函数如何定义?如何编写一个函数? 函数定于分为几种情况:1. 有形参 2.无形参 3.有返回值 4....无返回值 /* [函数的名称](函数的形参类型) { 函数体 } */ void func1(void) { } int func2(int a) { return 12;...函数如何传入形参并接收返回值?...c=a+b; return c; //返回结果,并终止函数执行 } 6. return 语句作用 return 本身功能终止函数执行,顺带返回一个值给调用者。
个人主页:艾莉丝努力练剑 专栏传送门:《C语言》 学习方向:C/C++方向 ⭐️人生格言:为天地立心,为生民立命,为往圣继绝学,为万世开太平 前言:前面几篇文章介绍了c语言的一些知识,包括循环、数组、函数...C/C++会把常量字符串存储到单独的一个内存区域, 当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。...有了对数组指针的了解,我们就可以介绍一下二维数组传参的本质哩。...那就意味着而维数组传参本质上也是传递了地址,传递的是第一行这个一维数组的地址,那么形参也是可以写成指针形式的。...结语 往期回顾: C语言指针深入详解(一):内存和地址、指针变量和地址、指针变量类型的意义、指针运算 掌握操作符(二):结构成员访问操作符,操作符的属性:优先级、结合性,表达式求值 C语言指针深入详解
一、指针与函数传参: 1、普通变量作为函数形参: (1)函数传参时,普通变量作为参数时,形参和实参名字可以相同也可以不 同,实际上都是用实参来替代相对应的形参的。...因为传参时是传值,所以这两个没区别)。所以在子函数内部,传进来的数组名就等于是一个指向数组首元素首地址的指针。...(3)结构体因为自身太大,所以传参应该用指针来传(但是程序员可以自己决定,你非要传结构体变量过去C语言也是允许的,只是效率低了)。...总的来说,函数参数传参用的比较多,因为这样可以实现模块化编程,而C语言中也是尽量减少使用全局变量。...函数传参如果传的是普通变量(不是指针)那肯定是输入型参数;如果传指针就有2种可能性了,为了区别,经常的做法是:如果这个参数是做输入的(通常做输入的在函数内部只需要读取这个参数而不会需要更改它)就在指针前面加
前言 C语言函数里最常用就是指针传参和返回地址,特别是字符串处理中,经常需要封装各种功能函数完成数据处理,并且C语言标准库里也提供了string.h 头文件,里面包含了很多字符串处理函数;这些函数的参数和返回值几乎都是指针类型...这篇文章就介绍如何使用指针作为函数参数、并且使用指针作为函数返回值。 下面通过几个示例代码来演示用法。 2....c=*a; *a=*b; *b=c; } //return语句只能返回一个值 //如果函数想返回多个值,可以使用指针(形参)实现。...编写一个字符串排序函数 函数功能: 传入字符串,在函数里实现字符串从大到小或者小到大排序。 注意: 从大到小或者小到大排序可以通过函数形参区分。...='\0'){} return str-p-1; } /* 函数功能: 实现字符串排序.支持从小到大或者大到小 函数形参: char *p 将要排序的字符串 char flag 选择排序方式
更改上面的代码,使用指针的方式来输出字符串: #include #include int main(){ char str[] = "http://c.biancheng.net...http://c.biancheng.net 除了字符数组,C语言还支持另外一种表示字符串的方法,就是直接使用一个指针指向字符串,例如: char *str = "http://c.biancheng.net...关于全局数据区、栈区、常量区以及其他的内存分区,我们将在《C语言内存精讲》专题中详细讲解,相信你必将有所顿悟,从根本上理解C语言。...第4行代码是正确的,可以更改指针变量本身的指向;第5行代码是错误的,不能修改字符串中的字符。...最后我们来总结一下,C语言有两种表示字符串的方法,一种是字符数组,另一种是字符串常量,它们在内存中的存储位置不同,使得字符数组可以读取和修改,而字符串常量只能读取不能修改。
文章目录 导引 指针函数 指针函数定义 指针函数的三种写法 代码示例 函数指针 定义 代码示例 函数指针和指针函数区别 定义不同 写法不同 用法不同 导引 函数指针和指针函数,在学习 C 语言的时候遇到这两个东西简直头疼...,当然还有更头疼的,比如什么函数指针函数、指针函数指针、数组指针、指针数组、函数指针数组等等,描述越长其定义就越复杂,当然理解起来就越难,特别是刚开始学习这门语言的童鞋,估计碰到这些东西就已经要崩溃了,...指针函数 指针函数定义 指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。...函数指针 定义 函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。...函数指针和指针函数区别 通过以上的介绍,应该都能清楚的理解其二者的定义。那么简单的总结下二者的区别: 定义不同 指针函数本质是一个函数,其返回值为指针。 函数指针本质是一个指针,其指向一个函数。
不带形参的main函数一般写成: int main() 或 int main(void) 表示mian函数没有参数,调用mian函数时不需要给出实参。...而main函数有形参的形式: int main( int argc, char** argv) int main( int argc, char *argv[]) 我是这样理解这两种方式,其中第一种方式...**argv是指针的指针,指针指向变量,指针是一个地址,所以*argv是一个地址。...第二种 *argv[]是指针数组,由于[]的优先级比*高,所以argv[]是一个数组,而数组名其实代表的是首地址,还是一个地址。所以这两种方法没有什么区别。
1.前言 学习指针的⽬的是使⽤指针解决问题,那什么问题,⾮指针不可呢? ✔在编程语言如C中,传值调用和传址调用是用来传递参数给函数的方法。...它们的主要区别在于参数传递的方式: ☞传值调用:这是最基本的参数传递方式,它涉及将参数的值复制一份传递给函数。...这种调⽤函数的⽅式我们之前在函数的时候就知道了,这种叫传值调⽤。 结论:实参传递给形参的时候,形参会单独创建⼀份临时空间来接收实参,对形参的修改不影响实 参。 所以Swap是失败的了。 那怎么办呢?...✔传址调⽤,可以让函数和主调函数之间建⽴真正的联系,在函数内部可以修改主调函数中的变量; 4.结论 所以未来函数中只是需要主调函数中的变量值来实现计算,就可以采⽤传值调⽤。...如果函数内部要修改主调函数中的变量的值,就需要传址调⽤。
"且为常量字符串,内容不会被修改,C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串时,他们实际会指向同一块内存,所以str3和str4相同。...二维数组传参本质 --认识了数组指针,下面来理解二维数组是如何传参的吧: //构建函数 void test(int arr[][5], int a, int b) { int i = 0; int...--就意味着二维数组传参本质上也是传递地址,传递的是第一行⼀维数组地址,那么形参也是可以写成指针形式的: void test(int(*arr) [5], int a, int b) { int i...#C语言——学习攻略:深挖指针路线(一)--指针变量、地址、意义与指针运算 2. #C语言——学习攻略:深挖指针路线(二)--const修饰、野指针分析、断言和指针的作用 3....#C语言——学习攻略:深挖指针路线(三)--数组与指针的结合、冒泡排序 结语:本篇内容就到这里了,主要分享了指针变量类型的一些内容,后续仍会分享指针的相关知识;指针的内容需要反复研读 ,如果这篇文章对你的学习有帮助的话
,所以str1和str2不同;但是这里str3和str4指向的是同一个常量字符串,C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串时,他们实际会指向同一块内存,所以str3和...p指向的数组的元素类型 数组指针类型:int (*) [10] //去掉名字就是类型 三.二维数组传参的本质 --学习了数组指针后,我们就可以来了解一下二维数组传参的本质了...那就意味着二维数组传参本质上也是传递了地址,传递的是第一行这个⼀维数组的地址,那么形参就像一维数组一样也是可以写成指针形式的。...(一)】--指针变量和地址,指针变量类型的意义,指针运算 【C语言指针超详解(二)】--const修饰指针变量,野指针的辩析,assret断言,指针的使用和传址调用 【C语言指针超详解(三)】--数组名的理解...,一维数组传参的本质,冒泡排序,二级指针,指针数组 结语:本篇文章就到此结束了,继前面几篇文章后在此篇文章中给大家分享了几类指针变量,函数指针数组,二维数组传参的本质等知识点,如果文章对你有帮助的话
指针字符串的正确表达: char a[] = "hello"; //ok char *b="hello"; //ok char c[10];c[10]="hello"; //error...char c[10];c="hello"; //error char *d;d="hello"; //ok char e[]={"hello"}; //ok char...指针字符串: char *b="hello"; b是变量,实际上把字符串的第一个字符的内存地址赋值给指针变量b。 注意: 使用字符数组定义字符串,字符串为字符串变量。...使用字符指针定义字符串,字符串为常量。...,并存放到指针变量b中。
- 个人主页:秦苒& ❄专栏传送门:《C语言》 指尖燃热血,代码铸锋芒;以信仰破局,向顶峰生长 秦苒&的简介: 前言:在【C语言指针二】从入门到通透:核心知识点全梳理...接下来由我带大家认识一维数组传参的本质、冒泡排序、二级指针、指针数组、指针数组模拟二维数组、字符指针变量吧!!...提示:以下是本篇文章正文内容,下面案例可供参考 一、一维数组传参的本质 接着我们来讨论⼀维数组传参的本质: ok上素材 数组名是数组首元素的地址;那么在数组传参的时候,传递的是数组名,也就是说本质上数组传参传递的是数组首元素的地址...正是因为函数的参数部分是本质是指针,所以在函数内部是没办法求的数组元素个数的。 划重点----- 总的来说一维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。...C/C++会把常量字符串存储到单独的⼀个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。