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;}

以上就是简单用法。

阅读全文
0 0
原创粉丝点击