Android-NDK之旅

01 - C语言基本数据类型和控制流程

2018-08-16  本文已影响12人  梁寅plus

01-C语言基本数据类型和控制流程

前言

目标

学习目标如下:

材料准备

IDE准备

我们的目的是执行NDK开发,所以我们的在IDE选择的时候,原则上是是要是文本编译工具都可以。当然,易用性和开发效率也需要考虑的话,推荐使用

VS社区版本是免费的,需要下载C,lunix的插件平台支持。

NDK开发语言说明

NDK使用C和C++开发都可。

C与C++

C中的基本数据类型

类型 长度/字节 取值范围 存储方式
char 1 -128~127 有符号二进制补码形式
[signed]char 1 -128~127
unsigned char 1 0~255
short [int] 2 -32768~32767
unsigned short [int] 2 0~65535
int 4 -2147483648~2147483647 定点有符号二进制补码形式
[signed] int 4 -2147483648~2147483647
unsigned [int] 4 0~4294967295
long [int] 4 -2147483648~2147483647
[signed] long [int] 4 -2147483648~2147483647
unsigned long [int] 4 0~4294967295 无符号(那就是正数啦)
float 4 -3.4*10^38~3.410^38* 浮点形式存储
double 8 -1.798*10^308~1.79810^308* 浮点形式存储
long double 8 -1.798*10^308~1.79810^308*
long long 8

注意,以上长度占用都是32位系统的,如果是64位,占用如下:

image

上表中第一行的大写字母和数字含义如下所示: 系统遵循的标准

l表示:int类型

L表示:long类型

P表示:pointer指针类型

32表示:32位系统

64表示64位系统

如:LP64表示,在64位系统下的long类型和pointer类型长度为64位。

64位Linux 使用了 LP64 标准 ,即:long类型和pointer类型长度为64位

8个位1个字节,上图中中的长度显示的是位数。

我们大部分系统,比如win系统是lLP32,LP64规则的。

C中的String

C中,是没有“java字符串”的,在 C 语言中,字符串实际上是使用 null 字符 '\0' 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。

下面的声明和初始化创建了一个 "Hello" 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 "Hello" 的字符数多一个

char hello[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

通常我们进行字符串定义的时候,使用如下方法:

char hello[] = "Hello";

C中有大量操作字符串的函数:

请在使用的时候引入包string.h

序号 函数 & 目的
1 strcpy(s1, s2); 复制字符串 s2 到字符串 s1。
2 strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。
3 strlen(s1); 返回字符串 s1 的长度。
4 strcmp(s1, s2); 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。
5 strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
6 strstr(s1, s2); 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

使用方式为:

#include <string.h>

/* 复制 str1 到 str3 */
strcpy(str3, str1);
printf("strcpy( str3, str1) :  %s\n", str3);

/* 连接 str1 和 str2 */
strcat(str1, str2);
printf("strcat( str1, str2):   %s\n", str1);

/* 连接后,str1 的总长度 */
len = strlen(str1);
printf("strlen(str1) :  %d\n", len);

string部分内容,摘取于菜鸟教程字符串

C中的数组

声明数组的时候,就需要声明数组大小,且必须在编译期间就定义。不能通过赋值等方式进行定义。

// 方式1
int intArray[10];
// 方式2
int intArray[] = {1,2,3,4,5}

与Java一样,必须将数组大小定义。当然,写法上与java有点不一样,这个需要注意。

至于前文提到的“且必须在编译期间就定义”,是为了避免如下写法:

int n = 5;
int array[n]; // 编译错误,必须直接定义

当然,如果使用const关键字,可以改变局面

const int n = 5;
int array[n]; // n用了const修饰,此处变异就可以通过

至于const是什么,请见下文解释。

C中的一些方法介绍

谈谈一些概念:堆栈与内存分配

控制流程

除了goto,其他都跟java一样。不多讲了。

谈谈一/二/三目运算符

如下表所示:

image

函数的调用与“声明”

C++程序调用函数,有点像脚本语言编程,如果方法在函数调用后定义,会编译报错,所以这里有一个概念叫做“声明”,也就是 .h文件,他能解决这个问题。

用VS写一个程式

讲了那么多,还是要玩一下的,这里就写一个指针程序吧,为下一篇文章做铺垫

新建程序

文件 --> 新建 -->项目

image

选择Visual C++,选中Win32控制台应用程序。

编写代码与执行程序

include <stdio.h>
include <tchar.h>
include <stdlib.h>

int _tmain(int argc, _TCHAR* argv[])
{
    // 变量,指针
    int x = 10;
    int *p = &x;

    // N目运算符
    printf("%p \n",p); // 打印十六进制内存地址
    
    int y = *p++;
    printf("%d \n",y);

    y = (*p)++;
    printf("%d \n",y);

    if (!y || y < 0 ){
        printf("不靠谱啊兄弟,y为%u \n",y);
    }

    // 命令框暂停
    system("pause");

    p = 0;

    return 0;
}

程序写完,选好调试模式(release还是debug),选择“本地windows调试器

程序返回结果为

0045FB74
10
-858993460 // 走到一个不知道什么值的内存上了
不靠谱啊兄弟,y为-858993460

对于里面的什么 *p啥的,目前看看就好,下一篇博文会讲解。

断点

与Eclipse,AndroidStudio等IDE一样,对应行数左边的列上点击即可。程序运行到了过后,是自动暂停的。

image

内存查找

调试模式下,在断点生效的情况下,可以打开“内存”窗口。

断点的时候,可以在“调试”--“窗口”--“内存”--选择内存1/2/3/4进行查看。数据查看需求调整到对应字节,并带符号显示

根据我们打印的内存值,可以在这个窗口中找到对应的值

image

如上图,根据数据类型,右键选择一些配置参数,可以看到对应的值。

学习目标小结

学习目标如下:

上一篇下一篇

猜你喜欢

热点阅读