首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言-指针作为函数类型

前言 C语言函数里最常用就是指针和返回地址,特别是字符串处理中,经常需要封装各种功能函数完成数据处理,并且C语言标准库里也提供了string.h 头文件,里面包含了很多字符串处理函数;这些函数的参数和返回值几乎都是指针类型...c=*a; *a=*b; *b=c; } //return语句只能返回一个值 //如果函数想返回多个值,可以使用指针()实现。...注意: 从大到小或者小到大排序可以通过函数区分。...='\0'){} return str-p-1; } /* 函数功能: 实现字符串排序.支持从小到大或者大到小 函数: char *p 将要排序的字符串 char flag 选择排序方式...0 局部变量默认值随机值(系统没有赋值) 静态变量默认值0 */

1.4K30

c语言函数指针的用法_函数指针作为

文章目录 导引 指针函数 指针函数定义 指针函数的三种写法 代码示例 函数指针 定义 代码示例 函数指针指针函数区别 定义不同 写法不同 用法不同 导引 函数指针指针函数,在学习 C 语言的时候遇到这两个东西简直头疼...,当然还有更头疼的,比如什么函数指针函数、指针函数指针、数组指针指针数组、函数指针数组等等,描述越长其定义就越复杂,当然理解起来就越难,特别是刚开始学习这门语言的童鞋,估计碰到这些东西就已经要崩溃了,...指针函数 指针函数定义 指针函数,简单的来说,就是一个返回指针的函数,其本质一个函数,而该函数的返回值一个指针。...其返回值一个 int 类型的指针一个地址。 这样描述应该很容易理解了,所谓的指针函数也没什么特别的,和普通函数对比不过就是其返回了一个指针(即地址值)而已。...函数指针 定义 函数指针,其本质一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针

57420
您找到你想要的搜索结果了吗?
是的
没有找到

C语言函数传指针指针

执行do_work(pData, 128); 这里传递的参数pData本身,所以进入void do_work(char *p, int size)函数之后,实参pData的内容就赋值给p,所以指针...到这里就已经看到程序崩溃的原因了:虽然给指针p赋值了,但是实参pData中的内容一直为空,因此从do_malloc函数返回之后,pData仍然一个空指针,所以就崩溃了。...在do_malloc函数中,调用系统函数malloc成功之后返回所分配空间的首地址,关键要把这个首地址送给pData指针,也就是说要让pData指针变量中的值等于这个堆空间的首地址。...p此时一个二级指针,参数赋值之后,p里面的内容就变成了pData这个指针变量的地址,也就是说p指向了pData这个变量。...执行*p = (char *)malloc(size + 1); 这句话首先搞明白*p啥意思,刚才说了,p一个指针,它指向了pData这个变量

2.1K20

C 语言】字符串模型 ( strstr-while 模型 | 抽象函数模型 | 业务子函数接口定义要点 | 指针间接赋值 | 返回值状态 | 指针处理 | 指针判空 | 返回值 )

---- 在上一篇博客 【C 语言】字符串模型 ( strstr-while 模型 ) 的基础上 , 将相关功能封装成 API 函数 , 将 主函数 与 子业务 函数分离开 ; 自定义函数接口 ; 分离...: 定义 局部 临时 指针变量 , 接收 函数变量 , 尽量不修改 函数 的值 ; 指针判空 : 凡是传入的指针 , 一律判定指针是否合法 ; 返回值处理 : 返回值不要直接修改 ,...先定义临时局部变量保存返回值 , 最后执行完毕 , 再将返回值 通过 间接赋值 赋值给 中的 返回值指针 指向的 内存地址 ; /* * 获取字符串中子串个数接口 * char *main_str...的值 , 使用指针变量接收 函数 char *main_str_tmp = main_str; char *sub_str_tmp = sub_str; // 返回值临时值...的值 , 使用指针变量接收 函数 char *main_str_tmp = main_str; char *sub_str_tmp = sub_str; // 返回值临时值

3.1K10

8.2 C语言指针变量

01怎么定义指针变量 1、一般形式 类型名 *指针变量名; 例子:int *point_1,*point_2; 左端的int在定义指针变量时必须指定的“基类型”。...3、一个变量指针的含义包括两个两个方面,一是以存储单元编号表示的地址,一它指向的存储单元的数据类型(如int,char,float等)。...02怎样引用指针变量 1、给指针变量赋值。如:p=&a;指针变量p的值变量a的地址,p指向a。 2、引用指针变量指向的变量。...2、不能企图通过改变指针的值而使指针实参的值改变。 3、函数调用可以得到一个返回值,而使用指针变量作参数,可以得到多个变化了的值。...C语言 | 函数实现输出I love you 更多案例可以go公众号:C语言入门到精通

1.3K2625

C语言|图解指针变量

= NULL; 图解: 1.1 己址和己空间 指针变量也是一个变量,对应一块内存空间,对应一个内存地址,指针名就是己址。...1.2 己值、他址、他空间 指针变量的值就是其指向的空间的地址,指向的地址的空间大小就是指针变量指向类型的大小。...1.3 声明与初始化 当声明一个指针变量,没有初始化时,指针变量只获得了其自身的内存空间,而其指向还没有确定,此时指针变量解引用做左值是非法操作。...#include #include int g(int **iptr) { // 当试图修改主调函数的一级指针变量时,被调函数的参数一个二级指针 if...a,偏移sizeof(int)个字节 *(b+3) = 'x'; // b+3指相对于地址b,偏移sizeof(char)个字节 printf("%d, %c\n",a[3],b

1.5K20

C语言指针变量

, 例如 指针变量int类型, 那么将来就只能保存int类型变量的地址 3、* : 标示这是一个指针变量,代表访问指针变量指向的那一块存储空间 4、指针变量只能存储地址...a4常量指针,指向整型的常量指针,即指针常量 //(可以间接修改指向变量的值,但是不可重新赋值新变量地址) const int * const a5; //a5指向整型常量的常量指针(...b, &b, bp, *bp); //修改后b=50, b地址: 5fbff64c, bp保存的地址:5fbff64c, *bp: 88 /* 这个地方有点奇怪,b常量,指针变量...bp指向b, 间接通过指针bp修改变量的值, 但是最后打印结果:*bp的值变了,b的值没有变(b常量,指针变量bp指向b), 而且bp保存的地址和b的地址还是保持一样 这究竟是为啥...,那么字符串一个常量不能修改,保存在内存常量区,不会被释放,多个相同的值对应的地址相同; */ 五、数组越界造成的访问不属于自己的内存空间 六、引用数据类型和基本数据类型,和实参 七、字符串和字符数组

2K30

C语言和实参的区别?

实参程序中已经分配了内存空间的参数,它可以被赋予一个具体的值,比如常数、数组、地址(指针),也可以是一个变量名、数组名或表达式,当然也包括指针变量。...则是你在写一个被调函数时,为了说明用到的自变量的类型、要进行什么操作而定义的,在调用函数前它不会被分配内存空间,更不会被赋予具体的值。...调用函数时,参会被分配一个新的内存空间,实参的值就会被“复制”进去,让它在被调函数中参与运算。而实参本身不参与这个运算,它仅仅起到一个传递值的作用(不过在C++中可以用&改变实参的值)。...如果参数的形式指针,那么“复制”的就是地址。

1.7K10

C语言和实参的区别?

实参程序中已经分配了内存空间的参数,它可以被赋予一个具体的值,比如常数、数组、地址(指针),也可以是一个变量名、数组名或表达式,当然也包括指针变量。...则是你在写一个被调函数时,为了说明用到的自变量的类型、要进行什么操作而定义的,在调用函数前它不会被分配内存空间,更不会被赋予具体的值。...调用函数时,参会被分配一个新的内存空间,实参的值就会被“复制”进去,让它在被调函数中参与运算。而实参本身不参与这个运算,它仅仅起到一个传递值的作用(不过在C++中可以用&改变实参的值)。...如果参数的形式指针,那么“复制”的就是地址。

3.6K20

C语言中只读指针变量与只读变量指针

只读指针变量和只读变量指针看着好像有点绕; 只读指针变量:意思只读指针变量 只读变量指针:只读变量指针 本文的主角const关键字 如果我们开发的时候,定义了某个变量,不想让别人修改时,就可以使用...首先定义两个整型变量 int a = 10; int b = 20; 普通的指针变量 先来看一下普通的指针变量: 我们定义一个普通的int类型的变量a,并初始化为10; 定义一个int类型的指针变量...那么打印出来p的值,就是a的值,10; //普通的指针变量 int *p = &a; printf("%d \n",*p);//10 //指向数值222 *p...也可以修改指针变量的地址; 只读指针变量 //只读指针变量 //这是一个const指针指向的int类型的变量 //const指针指向的整型变量 int *const cp1 = &a; *cp1...= 2;//值可以修改 *cp1 = &b; //cp1 = &b; //指针不能修改 值可以修改; 地址不能修改; 只读变量指针 //一个const指针指向的一个const整型的变量

2.4K20

C 语言】二级指针作为输出 ( 指针输入 | 指针输出 | 二级指针 作为 函数 使用示例 )

文章目录 一、二级指针 二、完整代码示例 一、二级指针 ---- 指针 作为 函数输入 : 调用者 负责 分配内存 ; 指针 作为 函数输出 : 函数 负责 分配内存 , 一般 传入二级指针 , 函数负责生成内存..., 并 使用 二级指针 指向 一级指针, 一级指针 指向 在 函数中 分配好内存 ; 如果要在 函数中 分配内存 , 则 需要 传入二级指针 , 在函数内部调用 malloc 函数 , 分配内存 ,...返回一个 一级指针 变量 ; 令 二级指针 指向 该 一级指针变量 , 即可通过间接赋值 返回相关结果 ; 代码示例如下 : /* * 生成 2 个字符串, 然后返回 */ int get_str...间接赋值 给 一级指针 *str2 = s2; return 0; } 二级指针 最终 指向的内存释放 : 释放二级指针 指向的 一级指针 指向的内存的地址 , 释放后 将指针指向的地址置空...return -1; } // 释放二级指针 指向的 一级指针 指向的内存的地址 // 释放指针 free(*str); // 将指针指向的地址置空

67110

初识C语言——初识指针(什么内存,什么指针指针变量怎么用,指针的大小)

C语言,有一种专门用来存储地址的变量,叫做指针变量。...指针变量的定义方法: 类型 * 指针变量名;(*说明该变量一个指针变量) 我们来演示一下: int num = 10; int *p;//p为一个整形指针变量 p = # 这样就把一个整型变量的地址放到了一个整型指针变量里边...("%c\n", ch); return 0; } 3.指针变量的大小 思考一个问题,整型变量的大小4个字节,char类型1个字节,double8个字节,那么指针变量的大小是多少?...为什么不同类型的指针变量大小一样的呢?又为什么4个字节呢? 原因指针用来存放地址的,所以指针变量的大小取决于地址的大小,而在同一平台上地址的大小固定不变的。...我们来验证一下: 在32位平台上: 4个字节 64位平台上: 8个字节 所以,我们得出结论: 指针变量的大小在同一平台固定的: 指针大小在32位平台4个字节,64位平台8

19410

c++:*与&, *&p, 指针传递,引用传递,数组

我们定义一个指针变量int *p; p指针变量,专门用来存放地址。...指针变量p既然变量,也同变量a一样对应一个小盒子,也有一个地址编号,&p就是取指针p的地址。...(&p) = p p指针,&p为p的地址 (取包有内容p的盒子的编号) 再进行解引用(拆开盒子),所以得到 *&p = p 指针传递 出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用...,函数内后续的任何改变都会影响原变量 数组 当要使用数组作为函数时,因为一个数组不能使用另外一个数组初始化,也不能将一个数组赋值给另外一个数组,而在“1.1 非引用”中提到要用实参的副本来初始化形...,所以实参为数组时,不能直接传递给

24520

C 语言】数组 ( 一维数组退化 | 二维数组退化 | 函数等价关系 )

文章目录 一、一维数组退化 二、二维数组退化 三、数组等价关系 一、一维数组退化 ---- C 中将 一维数组 作为参数 , 传递到函数中 , 该 一维数组 会退化为 指针 ; 将 int...中 , 如果将整个数组作为 , 需要拷贝整个数组的内容 , 如果数组有 1000 个元素 , 需要拷贝 4000 字节 , 这样效率就很低了 ; 如果只需要拷贝数组地址 , 这个地址存放在指针变量中..., 即 一级指针 ; 实参为 指针数组 int *array[10] , 等效的 为 一级指针 int **array ; 指针数组 数组的元素 都是 指针变量 ; 数组退化为 指针 , 指针指向的元素...也是 指针 , 则为 二级指针 ; 实参为 二维数组 int array[10][20] , 等效的 为 一级指针 int (*array)[20] ; 二维数组 的 数组的元素 一维数组...; 外围数组 ( 第二维 ) 退化为 指针 , 指针 指向的元素 一维数组 , 则为 指向 一维数组 的指针 , 每个一维数组有 20 个元素 ;

2.7K10

C 语言】字符串拷贝 ( 函数使用推荐方法 | 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 | 引入 辅助 局部 指针变量 )

文章目录 一、函数使用推荐方法 二、完整代码示例 一、函数使用推荐方法 ---- 在函数中 , 中的 指针变量 , 不建议直接使用 ; 推荐 在 函数中 , 定义 局部 指针变量 , 接收...中的 指针变量 , 具体操作的 函数中 定义的 局部指针变量 ; 直接使用 *to_tmp++ 样式的代码 , 会改变指针指向 , 有可能会导致错误 , 一旦出错 , 根本无法排查 ; 如果 将...数组首地址 的 常量指针指针指向 进行修改 , 直接就报错了 ; 函数 的 值 , 不要轻易进行改变 , 因此一般函数的 , 都定义为 const char * 指针常量 类型 ; 引入...指针指向的字符串 拷贝到 to 指针指向的字符串换 */ void str_copy(char *from, char *to) { // 使用局部变量 接收 char *from_tmp...拷贝到 to 指针指向的字符串换 */ void str_copy(char *from, char *to) { // 使用局部变量 接收 char *from_tmp =

80110

C 语言】字符串模型 ( 字符串翻转模型 | 抽象成业务函数 | 返回值 | 函数返回值 | 函数处理 | 指针判空 )

文章目录 一、字符串翻转模型 业务函数 二、完整代码示例 一、字符串翻转模型 业务函数 ---- 将上一篇博客 【C 语言】字符串模型 ( 字符串翻转模型 ) 的代码 , 主要业务逻辑 , 抽象成函数...; 字符串翻转模型 业务函数 要点 : 返回值 : 函数的返回值 , 一般使用 函数 间接赋值 进行返回 ; 下面的代码中 char *str 返回值 ; int inverse(char *...str) 函数返回值 : 函数的返回值 , 反映的函数的执行结果状态 , 返回 0 执行成功 , 返回 -1 执行失败 ; 函数处理 : 在 函数中 , 如果涉及到修改 指针变量 , 一般不直接使用..., 创建一个临时局部变量 , 接收 , 然后再执行相关操作 ; // 创建临时变量接收 函数 , 不要直接改变形的函数指向 char *str_tmp = str; 指针判空...: 函数的第一项任务就是 判定 指针是否合法 , 如果任何一个指针为空 , 直接返回 -1 ; // 判断传入的字符串指针是否为空 if(str_tmp == NULL)

89410
领券