Android| NDK开发之C语言基础

基本数据类型

数据类型 占用大小 取值范围
char 1字节 -128 到 127 或 0 到 255
int 整型 2 或 4 字节(与系统位数有关) -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
short 短整型 2 字节 -32,768 到 32,767
long 长整型 4 字节 -2,147,483,648 到 2,147,483,647
unsigned int 无符号整型 2 或 4 字节 0 到 65,535 或 0 到 4,294,967,295
float 单精度浮点型 4 字节 1.2E-38 到 3.4E+38
double 双精度浮点型 8 字节 2.3E-308 到 1.7E+308

地址&指针

  • & 表示取变量地址
#include <stdio.h> //引入c头文件
 
int main ()
{
    int num = 10;
    int *p;              // 定义指针变量
    p = &num;
 
   printf("num 变量的地址: %p\n", p);
   return 0;
}

输出 :
num 变量的地址: 0x7ffeeaae08d8
复制代码
  • 用星号(*) 修饰的变量表示指针变量,指针指向变量的地址
#include <stdio.h>
 
int main ()
{
   int  var = 20;   /* 实际变量的声明 */
   int  *ip;        /* 指针变量的声明 */
   ip = &var;  /* 在指针变量中存储 var 的地址 */
   printf("var 变量的地址: %p\n", &var  );
   /* 在指针变量中存储的地址 */
   printf("ip 变量存储的地址: %p\n", ip );
   /* 使用指针访问值 */
   printf("*ip 变量的值: %d\n", *ip );
 
   return 0;
}

输出:
var 变量的地址: 0x7ffeeef168d8
ip 变量存储的地址: 0x7ffeeef168d8
*ip 变量的值: 20
复制代码
  • 多级指针

多级指针就是指针的指针,对地址再取地址

#include <stdio.h>

int main(void)
{
    int i = 10;
    int *p = &i;
    //二级指针
    int **q = &p;
    //三级指针
    int ***r = &q;
    printf("p 地址 %p \n " ,p );
    printf("q 地址 %p \n " ,q );
    printf("r 地址 %p \n " ,r );
    printf("i = %d\n", ***r);
    return 0;
}

输出结果是:
 p 地址 0x7fff5feef944 
 q 地址 0x7fff5feef938 
 r 地址 0x7fff5feef930 
 i = 10
复制代码
变量 地址
i 10 0x7fff5feef944
p 0x7fff5feef944 0x7fff5feef930
r 0x7fff5feef930 &r

函数指针&回调函数

函数指针定义 : 返回值(*函数名)(参数…) , 例如 int(*p)(int,int)

#include <stdio.h>

int max(int x , int y ){
    return x>y?x:y;
}
int main(void) { 
	printf("函数指针");
	int a,b,c,d;
	//定义一个名字为p的函数指针
	int(*p)(int,int) =&max;
	printf("请输入三个数 :");
	scanf("%d %d %d ",&a,&b,&c);
	d = p(p(a, b), c); 
	printf("最大的数字是: %d\n", d);
	return 0;
}

输入 : 1 2 3
输出: 3
复制代码

回调函数: 将函数作为参数使用,回调函数就是一个通过函数指针调用的函数。简单来说回调函数是由别人的函数执行时调用你实现的函数。

#include <stdio.h>

int max(int x , int y, int(*action)(int,int)){
    return action( x,y);
}

int callback_method(int x , int y){
    printf("调用回调函数,返回最大值\n");
   return x>y?x:y;
}

int main(void) { 
	int a,b,c;
	//函数指针
	printf("请输入两个数 :\n");
	scanf("%d %d ",&a,&b);
	c = max(a,b,callback_method);
	printf("最大值为: %d\n", c);
	return 0;
}

请输入两个数 : 4 2 
调用回调函数,返回最大值
最大值为: 4
复制代码

结构体 struct

  • 结构体

数组可存储相同类型数据项的变量,结构体可存储不同类型的数据项
基本定义:

//注 : tag  member-list variable-list 至少要有两个
struct tag { 
    member-list
    member-list 
    member-list  
    ...
} variable-list ;
复制代码

例子

#include <stdio.h>
#include <string.h>
//定义一个tag为Books的结构体
struct Books {
    char author[50];
    char title[50];
    int book_id ;

};


int main(void) { 

  struct Books book1;
  struct Books book2;
  struct Books *p_book1;
  p_book1 =&book1;
  strcpy(book1.title,"Android 进阶指南");
  strcpy(book2.title,book1.title);
  strcpy(p_book1->title,"C/C++ 进阶指南");
  printf("book1 地址 = %p \n " , &book1);
  printf("指针结构体 p_book1 地址 = %p \n " , p_book1);
  printf("book2 地址 = %p \n " , &book2);
  printf("指针结构体 p_book1 title = %s \n " , p_book1->title);
  printf("book1 title = %s  \n" , book1.title);
  printf("book2 title = %s  \n" , book2.title);
  return 0;
}
输出:
book1 地址 = 0x7fffcfdf38d0 
指针结构体 p_book1 地址 = 0x7fffcfdf38d0 
book2 地址 = 0x7fffcfdf3860 
指针结构体 p_book1 title = C/C++ 进阶指南 
book1 title = C/C++ 进阶指南  
book2 title = Android 进阶指南   
复制代码

文件操作

打开文件操作

//filename文件名 , mode 模式
FILE *fopen( const char * filename, const char * mode );
复制代码

打开文件模式:

模式 描述
r 打开一个已有的文本文件,允许读取文件。
w 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。
a 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。
r+ 打开一个文本文件,允许读写文件。
w+ 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+ 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。

关闭文件

 int fclose( FILE *fp );
复制代码

写入文件

//参数 c 的字符值写入到 fp 所指向的输出流中。如果写入成功,它会返回写入的字符,如果发生错误,则会返回 EOF。
int fputc( int c, FILE *fp );
//把字符串 s 写入到 fp 所指向的输出流中。如果写入成功,它会返回一个非负值,如果发生错误,则会返回 EOF。
int fputs( const char *s, FILE *fp );
复制代码

读取文件

//读取单个字符
int fgetc( FILE * fp );
//读取 n - 1 个字符。它会把读取的字符串复制到缓冲区 buf,并在最后追加一个 null 字符来终止字符串。
char *fgets( char *buf, int n, FILE *fp );
复制代码

例子

#include <stdio.h>
 
int main()
{
   FILE *fp = NULL;
 
   fp = fopen("/tmp/test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   fclose(fp);
}
复制代码
#include <stdio.h>
 
int main()
{
   FILE *fp = NULL;
   char buff[255];
 
   fp = fopen("/tmp/test.txt", "r");
   fscanf(fp, "%s", buff);
   printf("1: %s\n", buff );
 
   fgets(buff, 255, (FILE*)fp);
   printf("2: %s\n", buff );
   
   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff );
   fclose(fp);
 
}
输出: 
This
2: is testing for fprintf...

3: This is testing for fputs...

//首先,fscanf() 方法只读取了 This,因为它在后边遇到了一个空格。
//其次,调用 fgets() 读取剩余的部分,直到行尾。最后,调用 fgets() 完整地读取第二行。
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享