NDK开发学习之C学习基础篇-2(函数指针,字符串,动态分配内存)
来源:互联网 发布:php 高德地图api 编辑:程序博客网 时间:2024/05/17 19:21
1、函数指针–指向函数的指针
在c语言中,函数本身不是变量,但可以定义指向函数的指针。这种类型的指针可以被赋值、存放在数组中、传递给函数以及作为函数的返回值等等。
int plus(int a,int b){ return a+b;}int main(){ int result; int (*calc)(int a,int b); //定义函数类型的指针calc calc = plus; printf("minus address=%#x\n",minus); result = calc(3,5); printf("result=%d\n",result); return 0;}
calc是一个跟plus相同类型的函数指针,所以可以将函数赋值给函数指针 cals = plus, plus函数名是一个函数的首地址。
result = calc(3,5);执行结果就跟plus函数的执行结果是一样的。result的值是8;
2、字符串
在java里字符串是String类型,但在c里没有String类型,字符串其实就是字符的数组。所以要初始化可以这样:
char ch2[] = {'c','h','i','n','a','\0','d'}; printf("ch2=%s\n",ch2);
printf打印的结果就是ch2=china . 后面的d字符没有打印是因为‘\0’这是一个空格符,%s在输出的时候会以空格为结束符,所以空格后面的d字符就没有了。
这种初始化方法显然很麻烦,所以还有更简单的一种方式:
char ch3[] = "china"; printf("ch3=%s\n",ch3);
这种方式打印结果是ch3=china ,同前面一种初始化是相同的。
那如果我们要想修改ch3数组的值改怎么办呢?
ch3= “hello”;这种是错误的。因为什么呢?我们之前在数组的时候说过ch3是这个数组的首地址,ch3是一个地址,是一个常量,是不能被赋值的。那么我们可以用strcpy函数来赋值。用此函数之前要引入string.h头文件。#include “string.h”
char ch3[] = "china"; printf("ch3=%s\n",ch3); strcpy(ch3, "hello"); printf("ch3=%s\n",ch3);
上面第一次打印结果是china,经过strcpy函数之后变成了hello。
另外字符串还可以用指针来声明,char *ch;
char *ch4 = "china"; // ch4 指向的是一个常量区 printf("%s\n",ch4);
这种方式是可以对其整体修改的,例如想把字符串改成hello,可以ch4=”hello”,为什么这样是可以的呢,因为ch4是一只指针,这个赋值操作就是修改了指针的指向。也就是ch4不再是指向”china”的首地址了,而是指向了”hello”的首地址。
在string这个标准库中有很多函数可以来操作字符串,下面列举一些;
size_t strlen(const char* string);
计算字符串的长度
char* strcpy(char* targetString, const char* stringToCopy);
把一个字符串地内容复制到另一个字符串里
char* strcat(char* string1, const char* string2);
连接两个字符串,就是把一个字符串接到另一个的结尾。
int strcmp(const char* string1, const char* string2);
比较两个字符串
strcmp返回:
0:当两个字符串相等时
非零的整数(负数或正数):当两个字符串不等时
3、内存的动态分配
手动申请内存空空要先了解两个函数malloc和free
malloc:是Memory Allocation的缩写,也就是英语“内存分配”的意思。询问操作系统能否使用一块内存空间
free:英语“解放,释放,自由的”的意思,意味着“释放那块内存空间”。告诉操作系统我们不再需要这块已经分配的空间了,这块内存空间会被释放,另一个程序就可以使用这块空间了
当我们手动分配内存时,须要按照以下三步顺序来:
1. 调用malloc函数来申请内存空间
2. 检测malloc函数的返回值,以得知操作系统是否成功为我们的程序分配了这块内存空间
3. 一旦使用完这块内存,不再需要时,必须用free函数来释放占用的内存,不然可能会造成内存泄漏
malloc申请内存
malloc分配的内存是在堆上,一般的局部变量大多是在栈上的,是系统自动分配的。malloc分配的内存是连续的,如果申请失败会返回NULL。
void* malloc(size_t numOctetsToAllocate);
int main(){ int *a = (int *)malloc(sizeof(int)); if(a!=NULL){ //do something } free(a); a = NULL; return 0;}
以上就是简单用法。
- NDK开发学习之C学习基础篇-2(函数指针,字符串,动态分配内存)
- NDK开发学习之C学习基础篇-1(指针,数组于指针,指针和函数参数,二级指针)
- ②看视频学习NDK之C函数指针
- C语言深入学习--checklist5:sizeof、指针、动态分配内存
- NDK开发系列之第四次课-NDK-C语言-函数指针+动态内存
- iOS开发学习之C语言---C10 函数指针-2
- android ndk 03 C语言 动态分配内存,字符串操作
- 指针之动态分配内存
- C语言基础学习之指针操作字符串反转
- [华赛面试题] C语言动态分配内存 用指针实现字符串的函数体外打印
- C语言学习篇-10指针与字符串、函数指针
- iOS开发学习笔记 2-9 C语言部分 内存分配函数 函数指针 指针函数 void*
- C学习笔记(1)--动态分配内存
- Android NDK开发之C语言基础及指针①
- C/C++学习之C提高----函数调用模型、指针做函数参数、字符串的基本操作、一级指针内存模型建立
- c语言—指针基础(8:动态分配内存)
- C++学习之C++动态分配内存
- iOS开发学习之C语言---C10 函数指针-1
- 我的web服务器中简单反向代理实现
- AGC018:Sports Festival(二分)
- 在Java中产生随机数的两个方法 转载
- H264中的SPS、PPS提取与作用
- LightOJ-1296 Again Stone Game(SG打表找规律)
- NDK开发学习之C学习基础篇-2(函数指针,字符串,动态分配内存)
- HTML5基本网页结构以及标签的改变
- Linux(Centos)下设置php-fpm开机启动
- 时间过渡和鼠标hover
- mysql索引列为空,也可以走索引
- 怎么理解面向对象和面向过程到底的本质区别?
- HTML5的离线存储
- 设置input标签内容不能复制
- Find The Multiple POJ