C语言基础复习总结
大一学的C++,不过后来一直没用,大多还给老师了,最近看传智李明杰老师的ios课程的C语言入门部分,用了一周,每晚上看大概两小时左右,效果真是顶一学期的课,也许是因为有开发经验吧,废话少说,直接把总结贴出来了~
#include <stdio.h>
int main(int argc, const char * argv[])
{
printf("Hello, World! ");
return 0;
}
#include是预处理指令,在编译前把尖括号里的内容原封不动地拷贝到对应位置。.h是头文件,里面是库函数的声明(不是实现)。尖括号表明是系统自带的,会去系统目录找,双引号是自己的文件,会先在源程序当前目录找,找不到就去操作系统的path路径找,还找不到才去C函数库里找。
包含关系允许嵌套包含但是不允许递归包含(死循环)。
C语言语法不严格,main函数可以不写返回值,默认返回int,参数可以不要,可以不return。
C语言程序运行的过程:
1.把源代码翻译成目标代码。Xcode是64位编译器。编译成功后生成同名.obj文件(多个c文件对应多个obj文件)。
2.把C语言源文件之间的调用依赖以及C语言函数库链接进来,成为可执行的机器代码。在xcode下生成的是unix可执行文件。
在java当中方法定义没有顺序限制,但是在标准c当中只能后面的函数调用前面的,因为C是从上往下编译的,如果想放在前面,需要声明,声明可以省略参数名,只要类型:
#include <stdio.h>
int sum(int, int);
int main(int argc, const char * argv[])
{
int c = sum(10,3);
printf("%d ", c);
return 0;
}
int sum(int a, int b)
{
return a+b;
}
一般来说,会把函数声明和定义放在不同文件当中,比如把sum函数的声明放在test.h里,实现放在test.c里,然后在main函数之前引入:
#include "test.h"
反复引用同一个文件是没关系的,可以使用预编译指令做检查机制。但是不要导入.c文件,以免在链接时出现函数重复而报错,C不是面向对象的,函数名不能重复。
printf输出需要使用百分号占位符,.2f是保留两位小数,不是四舍五入。
// My age is 26, height is 1.55, name is 李明杰,sex is 'A'
printf("My age is %d, height is %.2f, name is %s,sex is ‘%c’ ", 26,1.55f,"李明杰",'A');
scanf是阻塞性的函数,等待标准设备输入,需要传变量的地址。
#include <stdio.h>
int main(int argc, const char * argv[])
{
printf("请输入两个整数,用逗号隔开:");
int a,b;
scanf("%d,%d", &a, &b); //传a的地址
printf("%d ", a+b);
return 0;
}
C语言的类型分四类,一种是空类型viod,一种是int,float,double,char,一种是构造类型,比如数组,struct,union(基本没用),enum,另一种是指针类型void*。C是强类型语言,指定类型是为了分配适当大小的空间。Char类型不论多少位的编译器,都占一个字节。
C与java不同,局部变量没有初始化使用也不会报错,但默认值不一定是0,是随机数,所以不要不初始化。全局变量则会被默认初始化。
Char类型范围是-128到127,最好不用ascii码的值,直接用’a’,它不是unicode的,也不支持字符串。
类型修饰符:short,long,signed,unsigned,最常用的是修饰int,被修饰的int可以省略,比如只写long,与java不同,这并不代表这是long类型,而是int。不管什么编译器,int至少2个字节。
C语言里没有boolean,关系判断返回1或0的int值,没有-1!任何非0值都位真,只有0才是假,比如if(9)为真。
C语言可以用逗号连接多个表达式,它的返回值是最后一个表达式的值,下面的代码输出12。
#include <stdio.h>
int main(int argc, const char * argv[])
{
int a=9;
int b=10;
int c;
c = (a=a+1,b=3*4);
printf("%d",c);
}
对于一个变量,变量存储单元的“第一个字节”的地址就是该变量的地址,取地址用&,返回数字,习惯用16进制。
#include <stdio.h>
int main(int argc, const char * argv[])
{
char a = 'A';
int b = 66;
printf("%x ", &a);
printf("%x", &b);
}
数组用来存放“同一种”类型的变量,不能用变量做长度,应该用常量,但是xcode不会报错。系统为数组分配的空间是连续的。
int ages[5];
printf("%d",sizeof(ages));
得到的长度是20,C语言数组名就代表数组地址,所以ages就是个常量,不能赋值。取数组地址的方法有:
printf("%d ",&ages[0]);
printf("%d ",ages);
数组可以初始化,比如
int a[2] = {8, 10};
放在后面的元素可以省略,但是可读性不好,比如
int a[2] = {8, };
如果后面已经定义了全部元素则长度可省略,比如
int a[] = {8, 10};
C语言传参是传值,但是传数组(指针)的话则不是,实际传的是地址,所以内容会被改变。
#include <stdio.h>
//接受数组参数,可以不写长度
void test(int array[])
{
array[0] = 9;
}
int main(int argc, const char * argv[])
{
int a[3];
a[0] = 10;
printf("%d ",a[0]);
test(a); //数组名代表地址,传的是指针
printf("%d ",a[0]);
}
二维数组是一维数组的集合,是由一维数组组成的一维数组。它在内存中是按行存储的,比如a[0][0]->a[0][1]->a[0][2]->a[1][0]。
取地址的方式有a,a[0],&a[0][0]。
初始化可以按行:
int a[2][3] = {{1,2,3},{4,5,6}};
也可以都写出来:
int a[2][3] = {1,2,3,4,5,6};
可以部分省略,默认为0:
int a[2][3] = {{1,,3},{4}};
可以省略行数,不能省略列数:
int a[][3] = {1,2,3,4,5};
C语言没有String类型,多个字符用字符数组存储,为了和普通字符数组区分,字符串数组用’