C语言基础总结 分类: iOS学习 c语言基础 2015-06-11 10:08 23人阅读 评论(0) 收藏
//欲练此功必先自宫!!!
//第一天:C语言的基础
//进制
//2进制, 10进制, 8进制, 16进制
//注:8进制数前加0, 16进制数前加0x
//进制转换:
//10 -> n: 连除到取余
//n -> 10: 按权求和法(基数, 位权)
//n -> n: 1个8进制位 = 3个2进制位, 1个16进制位 = 4个2进制位
//字节
//1字节 = 8位2进制
//单行注释: //
//多行注释: /* */
//注:注释不参与程序编译, 可以出现在任何位置
//main函数: 是程序入口, 只能有一个
//数据类型
//基本类型: 1.整型: short int long 2.浮点型: float double 3.字符型: char
//构造类型: 1.数组[] 2.结构体struct 3.枚举enum
//指针类型: *
//空类型: void
//变量
//定义: 数据类型 变量名 = 初值
//注: 变量要先定义, 才能使用
//变量名的命名规范
//1.由数字, 字母, 下划线构成, 不能以数字开头
//2.在同一作用域内, 不能重名
//3.不能用系统的关键字(看颜色)
//4.见名知意(不用使用拼音, 汉字, 中英交叉)
//5.小驼峰法
//常量
//1, 19.9, 'c', "abc"
//运算符(单目, 双目, 三目)
//1.赋值运算符: =
//2.算术运算符: +, -, *, /, %, ++, --
//3.复合运算符: +=, -=, *=, /=, %=
//4.逻辑运算符: &&, ||, !
//5.关系运算符: >, >=, <, <=, ==, != (BOOL)
//6.条件运算符: ? :
//表达式 = 变量 + 常量 + 运算符
//语句: 程序执行的最小单元(见到;即语句)
//printf("Hi");
//printf("%d", a);
//格式化输出符
//char %c %d
//short %hd
//int %d
//long %ld
//float %f
//double %lf
//BOOL %d
//字符串 %s
//unsigned int %u
//unsigned long %lu
//八进制 %o
//十六进制 %x
//指针 %p
//以回车结束输入 %[^\n]
//%-10.2f:
//转义字符
//换行 \n
//tab \t
//% %%
//" \"
// \ \\
//scanf("%d", &a);
//注: ""内不能加\n, 后面写变量的地址
//第二天: 分支结构
//C语言的三大结构: 顺序结构, 分支结构, 循环结构
//if
//第一种形式
/*
if (<#condition#>) {
<#statements#>
}
*/
//第二种形式
/*
if (<#condition#>) {
<#statements#>
} else {
<#statements#>
}
*/
//第三种形式
/*
if (<#condition#>) {
<#statements#>
} else if (<#expression#>) {
<#statements#>
} else {
<#statements#>
}
*/
//注: 三种形式可以相互嵌套使用
//enum
enum 枚举名{
枚举值1,
枚举值2,
…
}
枚举值:枚举值默认从零开始,也可以指定数值;
枚举值常与switch合用
//switch
/*
switch (<#expression#>) {
case <#constant#>:
<#statements#>
break;
case <#constant#>:
<#statements#>
break;
default:
break;
}
*/
//注:1.switch后的表达式是整型表达式
//2.case后面的值是常量
//3.case和default中需要加break
//4.如果在case中定义变量, 需要case内部添加括号
/*
int a = 10;
switch (a) {
case 10:
{
int b = 100;
break;
}
default:
break;
}
*/
/*
//const用于修饰那一部分不能修改
//判断步骤
//1.去掉数据类型
//2.const后的就是不能修改的部分
int a = 10;
int b = 100;
const int *p1 = &a;//*p1不能修改
int const *p2 = &a;//*p2不能修改
int * const p3 = &a;//p3不能修改
const int * const p4 = &a;//p4和*p4不能修改
*/
/*
int max = 0, a = 5, b = 10;
max = a > b ? a : b;
if (a > b) {
max = a;
} else {
max = b;
}
*/
//第三天:循环结构
//for循环
/*
for (<#initialization#>; <#condition#>; <#increment#>) {
<#statements#>
}
*/
//while循环
/*
while (<#condition#>) {
<#statements#>
}
*/
//do...while循环
/*
do {
<#statements#>
} while (<#condition#>);
*/
//知道循环的次数, 使用for循环
//知道循环结束的条件, 使用while循环
//do...while循环使用比较少
//随机数公式[a, b]
//arc4random() % (b - a + 1) + a
//break: 跳出本层循环
//continue: 跳出本次循环, 加速循环的执行
//return: 跳出函数, 返回数值
//第四天:数组
//用于存储多个相同数据类型的有序队列
//数据类型 数组名[元素个数] = {};
//注: 元素个数可以省略, 由后面赋值来决定元素个数
//数值的使用
//1.数组不能够直接参与运算
//2.数组中的元素可以参与运算
//元素的访问
//1.通过下标访问数组元素
//2.下标从0开始, 到(元素个数 - 1)结束
//遍历数组
//遍历n维数组, 要嵌套n层for循环
//冒泡排序
/*
int array[5] = {12, 20, 3, 48, 5};
for (int i = 0; i < 5 - 1; i++) {
for (int j = 0; j < 5 - 1 - i; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
*/
//字符数组 = 字符串
//打印字符串: %s
//字符串函数
//strlen: 字符串长度
/*
char string[10] = "iPhone";
printf("%lu\n", strlen(string));//长度:6
printf("%lu\n", sizeof(string));//字节数:10
*/
//strcpy: 字符串拷贝
//strcat: 字符串拼接
//strcmp: 字符串比较
/*
int c = 5;
int array[c] = {};//数组定义时, 元素个数不能使用变量
*/
//第五天: 多维数组
//定义
//数据类型 数组名[维度1][维度2][...] = {};
//字符数组, 一维数组
//字符串, 一维数组
//字符串数组, 二维数组
/*
char string[5][20] = {"zhangsan", "lisi", "asan", "erhu", "guangtouqiang"};
//冒泡排序(a-z)
for (int i = 0; i < 5 - 1; i++) {
for (int j = 0; j < 5 - 1 - i; j++) {
if (strcmp(string[j], string[j + 1]) > 0) {
char temp[20] = {0};
strcpy(temp, string[j]);
strcpy(string[j], string[j + 1]);
strcpy(string[j + 1], temp);
}
}
}
*/
//第六天: 函数
//具有特定功能的代码段
//一个严格的函数包括
//1.函数声明
//2.函数定义
//3.函数调用
//函数定义
/*
返回值类型 函数名(参数类型 参数名, ...) {
}
*/
//注: 1.没有返回值, 使用void
//2.没有参数, 括号不能省略
//3.参数类型相同, 类型不能省略
//4.函数之间是并列的关系, 不能嵌套定义
//函数调用
//函数名(实参, ...)
//实参: 函数调用时的参数
//形参: 函数定义时的参数
//注: 函数调用时, 把实参的值拷贝给形参
//主调函数: 在函数a中调用了函数b, 函数a就称为函数b的主调函数
//局部变量: 定义在函数体内部的变量
//全局变量: 定义在函数体外部的变量
//注: 尽量不要使用全局变量
//函数可以嵌套调用
//递归函数, 一定要有出口
//*.h中写 函数声明
//*.m中写 函数定义
//如果在其他文件使用函数, 需要引入头文件
//数组作为函数的参数
//1.,数组名[],数组的元素个数省略
//2.多添加一个参数, 用于传递数组元素个数
//第七天: 结构体
//结构体是用户自定义的数据类型
//结构体声明
/*
struct <#struct name#> {
<#struct fields#>
};
*/
//注:1.结构体名字用小驼峰法
//2.每一个成员变量以分号结束
//3.结构体声明写在.h中
//结构体变量
//struct 结构体名 变量名 = 初值
//注: 1.结构体变量可以直接参与运算
//2. 结构体变量不能够直接打印
//结构体变量的成员变量
//使用点语法访问
//使用typedef对结构体重命名
//typedef 原结构体名 新结构体名
//注: 新结构体名要是大驼峰法
//结构体所占的字节数
//1.最大数据类型的倍数
//2.交换成员变量的位置, 会影响结构体所占的字节数
//char 1
//short 2
//int 4
//long 4或8
//float 4
//double 8
//指针 4或8
//结构体和数组相互嵌套使用
//1.结构体声明时, 成员变量是数组类型
//2.数组内存放的都是结构体类型的变量(结构体数组)
//第8天: 指针
//内存的地址编号
//&: 取地址运算符
//%p 打印地址
//指针变量: 用于存储地址
//数据类型 *变量名 = NULL
//注:1. 指针变量所占的字节数和数据类型无关, 只有操作系统的位数相关
//2.数据类型决定*p取内容时, 取多少个字节
//3.数据类型决定p + 1时, 跳转多少个字节
//*: 取值运算符
//指针变量被重新赋值, 意味着指针变量重定向
//指针的运用
//指针在数组中的运用
//数组的名字就是数组的首地址
// int a[5] = {1, 2, 3, 4, 5};
//*a a[0]
//*(a + 1) a[1]
//*(a + i) a[i]
// int *p = a;
//p 和 a 的区别
//1. 数组的名字a是一个常量指针, 不能重定向(修改)
//2. sizeof, p: 求指针所占的字节数; a: 求数组所占的字节数
//指针在字符串中的运用
// char string[] = "iOS";
// printf("%s\n", string);
// printf("%s\n", string + 1);
//
// char *q = string;
// printf("%s\n", q);
//第9天: 指针高级
//指针数组: 数组中元素类型是指针类型
int a = 10;
int b = 20;
int c = 30;
int *p[3] = {&a, &b, &c};
//p[0] &a *p
//p[1] &b *(p + 1)
//p[2] &c *(p + 2)
//*p[0] a *(*p)
//*p[1] b *(*(p + 1))
//*p[2] c *(*(p + 2))
//指针作为函数的参数
//作用: 在函数内部修改外部变量的值
//(int array[], int count)
//(int *array, int count)
//指针在结构体变量中的使用
//定义一个结构体指针变量 指向 结构体变量的首地址
//可以用->(指向操作符), 访问结构体的成员变量
//指针在结构体数组中的使用
struct student {
char name[20];
int age;
float score;
};
typedef struct student Student;
Student array[3] = {
{"zhangsan", 18, 59.9},
{"lisi", 20, 69},
{"wangmazi", 40, 30}
};
//array[0].name (*array).name
//array[1].name (*(array + 1)).name
//array[2].name (*(array + 2)).name
//array->name
//(array + 1)->name
//(array + 2)->name
//第10天: 动态内存分配
//内存的五大分区(地址编号由高到底)
//1.栈区(局部变量, 系统控制)
//2.堆区(由开发人员手动申请, 手动释放)
//申请 malloc
//释放 free p = NULL
//3.静态全局区(全局变量和static修饰的变量, 系统控制)
//static变量特点
//a. 存在静态全局区
//b. 只能被初始化一次
//c. 没有赋初值, 默认为0
//4.常量区(常量, 系统控制, 常量区的内容是只读的)
//5.代码区(函数,语句, 系统控制)
//第11天: 函数指针
//函数的名字就是函数的首地址
//函数指针类型确定的步骤
//1.把函数名换(*)
//2.去掉函数体和参数名
//int (*)(int, int)
/*
int printHello(int a, int b) {
}
*/
//函数指针变量
//int (*p)(int, int) = NULL
//注: 变量名写在*后面
//使用typedef重命名函数指针类型
//typedef int (*Type)(int, int)
//注: 新类型名, 写在*后面
//Type p = NULL
//指针指向函数的首地址
//p = printHello;
//printHello(3, 4)
//p(3, 4)
//回调函数: 使用函数指针变量调用函数
//函数指针变量作为函数的参数, 函数可以实现多种功能
//前提: 函数指针类型相同
//宏
//无参宏 只做简单地替换
//有参宏 #define kSum(A,B) ((A)+(B))
//表达式中的每一个参数加括号,整个表达式也要加括号
//条件编译
//三种条件编译
/*
#ifdef 标识符
代码段1
#else
代码段2
#endif
如果 标识符 被 #define 过 ,编译器编译代码段1,否则编译代码段2。
#ifndef 标识符
代码段1
#else
代码段2
#endif
如果 标识符 未被 #define 过 编译器编译代码段1,否则编译代码段2。
#if 常量表达式
代码段1
#else
代码段2
#endif
如果 常量表达式结果 非0 编译器编译代码段1,否则编译代码段2。
三种形式一样,以后主要用于版本控制;
*/
//经前人总结,若不自宫也能成功!!!
版权声明:本文为博主原创文章,未经博主允许不得转载。
C语言基础总结 分类: iOS学习 c语言基础 2015-06-11 10:08 23人阅读 评论(0) 收藏的更多相关文章
- C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏
C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...
- 提高编程能力的7条建议 分类: T_TALENT 2014-04-12 10:41 294人阅读 评论(0) 收藏
编程是非常酷的一件事情,但是在酷炫的背后它对很多人来说还是挺难的.很多人在学习编程之初就被困难击败了. 当你不熟悉编程的时候,你可能会觉得无从下手,并且不知道如何运用学到的知识.只要你通过了这一困难的 ...
- C语言基础:内存 分类: iOS学习 c语言基础 2015-06-10 21:59 23人阅读 评论(0) 收藏
全局变量:定义在函数之外.(不安全) 局部变量;定义在函数之内. 内存的划分:1栈区 2堆区 3静态区(全局区) 4常量区 5代码区 栈区..静态区.常量区.代码区的数据都是由系统分配和释放 ...
- OC基础:block.字面量 分类: ios学习 OC 2015-06-22 19:08 155人阅读 评论(0) 收藏
block 块语法,可以用block去保存一段代码,或者封装一段代码. block 实际是由c语言实现的,执行效率很高. block 实际借鉴了函数指针的语法. block,在多线程.异步任务,集合遍 ...
- 菜鸟学习-C语言函数参数传递详解-结构体与数组 分类: C/C++ Nginx 2015-07-14 10:24 89人阅读 评论(0) 收藏
C语言中结构体作为函数参数,有两种方式:传值和传址. 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数.在这种情况下 ...
- 分类算法简介 分类: B10_计算机基础 2015-03-09 11:08 257人阅读 评论(0) 收藏
一.决策树 决策树是用于分类和预测的主要技术之一,决策树学习是以实例为基础的归纳学习算法,它着眼于从一组无次序.无规则的实例中 推理出以决策树表示的分类规则.构造决策树的目的是找出属性和类别间的关系, ...
- iOS开发:创建真机调试证书 分类: ios相关 2015-04-10 10:22 149人阅读 评论(0) 收藏
关于苹果iOS开发,笔者也是从小白过来的,经历过各种困难和坑,其中就有关于开发证书,生产证书,in_house证书,add_Hoc证书申请过程中的问题,以及上架发布问题.今天就着重说一下关于针对于苹果 ...
- ubuntu中安装eclipse 分类: android ubuntu linux 学习笔记 2015-07-07 10:19 75人阅读 评论(0) 收藏
上一篇说了安装jdk的事,于是趁热打铁,决定把eclipse也安装了. 下载这一系列就不用说了. 下载完成之后: 然后解压,解压之后文件剪切到/usr/software文件夹中,同时重命名为eclip ...
- ubuntu14.04使用root用户登录桌面 分类: 学习笔记 linux ubuntu 2015-07-05 10:30 199人阅读 评论(0) 收藏
ubuntu安装好之后,默认是不能用root用户登录桌面的,只能使用普通用户或者访客登录.怎样开启root用户登录桌面呢? 先用普通用户登录,然后切换到root用户,然后执行如下命令: vi /usr ...
随机推荐
- MongoVUE的Collections数据不显示的解决方法
问题描述: 使用 mongoDB数据库, 数据添加成功了,使用命令行能查询出来,但在MongoVUE 中数据却不显示 (我使用的是 mongoDB 3.4 的版本) 原因:引擎问题,只要降到2.X版 ...
- codeforces 351 div2 C. Bear and Colors 暴力
C. Bear and Colors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Cocos2d-x学习笔记(九)场景切换
这里只介绍两个简单的两个场景相互切换的方法. void pushScene(Scene *sn)和void popScene(Scene *sn)是一对.前者将当前场景放入到场景堆栈中,并切换到下一个 ...
- marquee 跑马灯公告
1.原始 marquee 2.自定义 marquee .tops { color: #fff; height: 23px; margin: 0 0 0 20px; min-height: 23px; ...
- laravel command
(1) 新建一个command类,并在command类里面写相应的执行函数 其中变量act就是指函数名,handle里面会先判断该函数是不是存在,如果存在就执行,如果不存在就提示函数不存在 class ...
- ns-3
二.NS-3C++脚本的编写如前所述,NS-3的脚本使用C++语言(也支持python),使用四种类型的网络构件(Node.NetDevice.Channel.Application).一个简单的脚本 ...
- SQL Server 创建定时任务JOB
1. SQL Server 代理 → 作业(右键)→新建作业 2.在[常规]中输入 “名称” 并确认已勾选 “已启动”. 3.在[步骤]中 "新建步骤": 填写 “步骤名称 ...
- 基于zuul实现自定义路由源码分析
ZuulFilter定义 通过继承ZuulFilter我们可以定义一个新的过滤器,如下 public class IpAddressFilter extends ZuulFilter { @Autow ...
- response.setHeader的各种用法 ------ 笔记(一)
转载地址:https://blog.csdn.net/junmoxi/article/details/76976692 1.一秒刷新页面一次 response.setHeader("refr ...
- python数据类型高阶
python是近年来使用最广泛的一种编程语言,不管是做web开发,还是网络爬虫,亦或是数据分析等,大家都在选择python来完成这些任务:我想最重要一点就是python学起来很简单,另一个点就是pyt ...