C语言简介

system()是提供C语言调用系统命令的函数

C语言基本数据类型

C语言中的整数类型:char/short/int/long

C中使用ASCII保存字符,所以char所占用的字节数为1

Java中使用Unicode编码,char所占的字节数为2

C中long类型在32位操作系统中占用4个字节,在64为操作系统中占用8个字节

Java中long类型默认占用8个字节

sizeof()是运算符,用来计算一个类型占的字节数,如果括号内是变量,则计算的是该变量所对应数据类型所占的字节数

signed/unsigned:用来修饰整数类型,表示有符号/无符号,缺省为signed有符号类型,加上该关键字不会影响整数类型所占的字节数

C语言中没有boolean类型,可以使用unsigned char代替

C语言中的float/double类型和Java中的float/double类型所占字节数相同

float:4个字节,4bytes

double:8个字节,8bytes

C语言输入输出函数

都需要包含头文件:stdio.h

格式化输出函数:printf(f代表format)

输出整数:

%d 十进制有符号 int

%u 十进制无符号 unsigned int

%o 八进制无符号 unsigned int

%x 十六进制无符号 unsigned int

%ld    输出long类型
%hd 输出short类型 在%o和%x中间加#,可以输出前导,八进制自动加0,十六进制自动加0x

输出字符:

%c 输出一个字符

%s 输出一个字符串,即若干个字符

输出长整形和浮点数:

%f 输出float类型

%lf 输出double类型

输出变量的内存地址:

%p

备注:C语言中要想输出关键字符,需要重复该字符即可,例如输出%d,使用printf("%%d")

输入函数:

输入普通数据:

scanf("%d",&i); // &i告诉scanf输入的数据存放在哪里,取出变量i的内存地址,并将数据保存到那块内存空间中

输入字符串的写法:

char buf[10];//字符数组,可以保存字符串 '\0'作为字符串的结束标志 默认占一个长度,所以buf[10]中最多保存9个输入的字符

printf("输入字符串:");

scanf("%s",buf);//数组名代表数组首元素首地址 buf[0] &buf[0] <=> buf

printf("buf:%s\n",buf);

备注:数组名代表数组首元素的首地址,等价于&buf[0]

C语言中的指针

号的作用:

1.乘法运算 i
j

2.定义指针变量 int *p; *只是为了区分变量类型,不是普通变量,等价于(int *)p;

3.取对象云算法 *p

指针的指向

如果一个指针变量保存了一个对应类型变量的首地址,指针变量指向这个变量,可以用指针运算符*访问指向变量

指针变量在不影响理解时,都称为指针

指针的误用

1.指针没有合法的指向(野指针),初始值NULL

2.混用指向不同类型的指针,如果真要把不同类型的地址赋给指针变量,需要强转

指针的两个关键属性:地址和(指向)类型

C语言中的引用传递

include <stdio.h>

void swap(int *pa, int *pb) {

printf("swap start\n");

printf("a = %p, b = %p\n", pa, pb);

printf("a = %p, b = %p\n", &pa, &pb);

int temp = 0;

temp = *pa;

*pa = *pb;

*pb = temp;

printf("a = %p, b = %p\n", pa, pb);

printf("a = %p, b = %p\n", &pa, &pb);

printf("swap end\n");

}

int main() {

int a = 10;

int b = 20;

printf("a = %d, b = %d\n", a, b);

printf("a = %p, b = %p\n", &a, &b);

swap(&a, &b);

printf("a = %d, b = %d\n", a, b);

printf("a = %p, b = %p\n", &a, &b);

return 0;

}

输出结果:

结果分析:

通过操作内存地址,交换指向内存的指针,从而达到交换数据的目的

操作内存地址,相当于操作变量

Java中的引用传递,类似于C中的地址传递

通过调用Java中的函数,传递一个对象作为参数,在函数执行过程中,可以修改对象内部的属性数据,在函数执行完毕以后,再读取该数据,就能实现Java的引用传递

关于C字符串存储和操作

C语言中没有字符串类型,需要用字符数组来表示字符串

char buf[10];字符数组用来保存字符串

char *p = buf;字符指针可以保存字符串首地址,从而找到并处理字符串,长度是根据字符串的结束标志'\0'来判断

运算符sizeof()只能获取字符数组所占用的内存空间,而不能获取字符数组中字符串的长度

可以使用string.h库中的函数strlen()来获取字符数组中字符串的长度,获取的长度不包括'\0'

局部变量存储在堆空间,用的时候需要申请,用完以后自动释放

指针变量运算

指针变量加减一个整数n,指针向高地址或低地址移动n个对象,要求在一段连续的内存空间上移动

数组

C语言的编译器不会检查数组的下标越界,需要特别注意,历史上有很多缓冲区越界带来的漏洞

数组首地址和数组元素首地址的区别

1.它们的地址值是相等的;

2.第1个元素的地址如果是p,则p+1就是第2个元素的地址;

3.数组的首地址如果是p,则p+1就跳过这个数数组而指向这个数组最后一个元素最后一个字节的下一字节。

指针和数组的关系

a[i] <=> *(a + i) <=> *(p + i) <=> p[i]

C语言运行时的内存分配

内存分为四个区段:代码段、静态区、堆区、栈区

代码段(从低地址向高地址扩展)

code/text

存放程序的二进制指令

静态区(从低地址向高地址扩展)

特点:定义一次,多次使用,如果未赋初值,初值会自动为0,生命周期和程序运行的时长相同

bss:

存放未赋初值的全局变量

static修饰的局部变量

data:

存放已赋初值的全局变量

static修饰的局部变量

堆区(从低地址向高地址扩展)

特点:手动申请,手动释放,使用时需导入stdlib.h头文件

使用malloc、free、realloc函数进行申请、释放和重新申请

否则可能会造成内存溢出

栈区(从高地址向低地址扩展)

特点:用时申请,用完释放,如果不赋初值,初值随机

存放的是函数内定义的变量,生命周期短

JNI_day01的更多相关文章

随机推荐

  1. 一个排查了大半天儿的问题,差点又让 MyBatis 背锅

    我是风筝,公众号「古时的风筝」,一个不只有技术的技术公众号,一个在程序圈混迹多年,主业 Java,另外 Python.React 也玩儿的 6 的斜杠开发者. Spring Cloud 系列文章已经完 ...

  2. 【雕爷学编程】Arduino动手做(60)---WS2812直条8位模块

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...

  3. spark机器学习从0到1特征选择-卡方选择器(十五)

      一.公式 卡方检验的基本公式,也就是χ2的计算公式,即观察值和理论值之间的偏差   卡方检验公式 其中:A 为观察值,E为理论值,k为观察值的个数,最后一个式子实际上就是具体计算的方法了 n 为总 ...

  4. nginx配置之错误和访问日志功能

    错误日志功能:logs/error.log nginx.conf中: #error_log logs/error.log; #error_log logs/error.log notice; #err ...

  5. MySQL 选错索引的原因?

    MySQL 中,可以为某张表指定多个索引,但在语句具体执行时,选用哪个索引是由 MySQL 中执行器确定的.那么执行器选择索引的原则是什么,以及会不会出现选错索引的情况呢? 先看这样一个例子: 创建表 ...

  6. mysql小白系列_04 datablock

    1.为什么创建一个InnoDB表只分配了96K而不是1M? 2.解析第2行记录格式?(用下面的表定义和数据做测试) mysql> create table gyj_t3 (),name2 var ...

  7. 马兴德201771010117《面向对象程序设计(java)》第一周学习总结

    第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com 挽歌朽年 程序设计评测:https://pintia.cn/ 791683057@qq ...

  8. 【MySQL】深入理解MySQL锁和事务隔离级别

    先看个小案例: 话不多说,上案例,先创建一个表 mysql> CREATE TABLE IF NOT EXISTS `account`( `id` INT UNSIGNED AUTO_INCRE ...

  9. json字符串转List集合

    public List<Map<String,PendingInfo>> jsonToList(String json){//PendingInfo可以换成其它bean类 Li ...

  10. linux高级应用第九章-正则表达式

    笔记部分 基础正则表达式: ^   第1个符号 ,以什么什么开头   ^m $  第2个符号,以什么什么结尾  m$    ,还表示空行,或空格,可以用cat  -An 试一下 ^$ 第3个符号,空行 ...