C语言学习入门

Posted shineflowers

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言学习入门相关的知识,希望对你有一定的参考价值。

编译文件:cc -c one.c two.c  生成.o目标文件

链接文件:cc one.o two.o     默认生成 a.out 执行文件

指定生成的可执行文件名   cc -o one one.o 


连续编译、链接:cc one.c      cc -o one one.c    中间生成的.o文件会被删除,最后生成执行文件

cc one.c two.c   源文件超过一个时,目标.o文件便不会被删除,

以后可以只编译更改的源文件  cc one.o two.o three.c



C语言32个关键字:

auto double int struct break else long switch

 

case enum register typedef char extern return union


const float short unsigned continue for signed void

 

default goto sizeof volatile do if while static





常量修饰:const

c 语言中的进制: 二进制:int a = 0B(b)1100 ;   八进制: int b = 027; 十六进制:int c = 0X(x)AF3;


printf(“%d”, a);      printf(“a=%d, b=%x”, a, b);


%4d,  若表示的位数大于4,再按原样输出; 若小于4,则补上空格输出4位,, +4空格补左边,-4空格补右边


%.2f  输出两位小数,默认是6位


  %p    输出内存的地址,,   如:printf(“变量a的地址是:%p”, &a)


scanf(“%f”, &a);  scanf(“%d, %s,%f”, &a,&b,&c);   接收多个时,分隔符可以是任意符号

包括空格、tab、回车




当数值比较小(在char的取值范围内),用char 比用int 更节省内存开销,因为它只占1个字节

char c = ‘A’;与 char c = 65; 是等效的。一个汉字占两个字符,用char是不行的,

需要用字符数组来存储。


局部变量可以在声明时不初始化,后续使用,与java不同;如果后续赋值是可以的,如果后续直接

使用系统赋给它的默认值是不好的,因为这是一个随机的垃圾值,不是0。


可以在基本数据类型的前面加一些修饰符,也有人称之为限定符,一样的意思。

有以下4种类型修饰符:

  • short  短型
  • long  长型
  • signed  有符号型     包括 正负数和0
  • unsigned  无符号型         正数和0 


// 下面两种写法是等价的

short int s1 = 1;

short s2 = 1;


// 下面两种写法是等价的

long int l1 = 2;

long l2 = 2;


// 可以连续使用2个long

long long ll = 10;


// 下面两种写法是等价的

signed int si1 = 3;

signed si2 = 3;


// 下面两种写法是等价的

unsigned int us1 = 4;

unsigned us2 = 4;


// 也可以同时使用2种修饰符

signed short int ss = 5;

unsigned long int ul = 5;


unsigned char c1 = 10;

signed char c2 = -10;


long double d1 = 12.0;


short int 取值范围 类似java中的 short

long int                                            int

long longlong


C语言的基本语句跟Java中的差不多

  • 循环语句(do while、while、for)
  • 条件语句(if 、if-else、switch)
  • goto语句  (比如在循环外 定义一个标记 Exit:;  在循环内可以 用 goto Exit;跳出循环)


算术运算符

  • +  加法运算符
  • -  减法运算符,或负值运算符
  • *  乘法运算符
  • /  除法运算符
  • %  模运算符,或称取余运算符,要求%两侧均为整型


关系运算符

  • <   小于运算符
  • <=  小于等于运算符
  • >   大于运算符
  • >=  大于等于运算符
  • ==  等于运算符
  • !=  不等于运算符


C语言中没有boolean类型

在C语言中,关系运算的结果为"真"就返回1,"假"就返回0

int a1 = 5 >4;// 1


int a2 = 5 <4;// 0

还需注意的是,在C语言中,任何非0值都为"真",只有0值才为"假"如:if(-1) 

if (a=0)

在C语言中,可以不保存关系运算的结果因此,下面的写法是合法的:

int a = 10;

a > 10;

a == 0;


逻辑运算符

  • &&  逻辑与运算符
  • ||  逻辑或运算符
  • !   逻辑非运算符

逻辑运算的结果也只有两个:成立就为"真",返回1;不成立就为"假",返回0

复合赋值运算符

  • +=  加赋值运算符。如a += 3+1,等价于 a = a +(3+1)
  • -=  减赋值运算符。如a -= 3+1,等价于 a = a -(3+1)
  • *=  乘赋值运算符。如a *= 3+1,等价于 a = a *(3+1)
  • /=  除赋值运算符。如a /= 3+1,等价于 a = a /(3+1)
  • %=  取余赋值运算符。如a %= 3+1,等价于 a = a %(3+1)

自增运算符和自减运算符

  • ++  自增运算符。如a++,++a,都等价于a = a+1
  • --  自减运算符。如a--,--a,都等价于a = a-1

逗号运算符和逗号表达式

* 逗号运算符主要用于连接表达式,例如:

int a = 9;

int b = 10;

a = a+1 , b = 3*4;

逗号表达式的运算过程是:从左到右的顺序,先计算表达式1,接着计算表达式2,...,最后计算表达式n

整个逗号表达式的值是最后一个表达式的值c = (++a, a *= 2, b = a * 5); <==> c=b;

三目运算符int a = (b >5) ? 10 : 9;

sizeof可以用来计算一个变量或者一个常量、一种数据类型所占的内存字节数。

sizeof(10);

char c = 'a';

sizeof(c);

sizeof(float);

地址

1.计算机中的内存是以字节为单位的存储空间。内存的每一个字节都有一个唯一的编号,这个编号就称为地址

凡存放在内存中的程序和数据都有一个地址,也就是说,一个函数也有自己的内存地址

2.  当定义一个变量时,系统就分配一个带有唯一地址的存储单元来存储这个变量。比如:

char a = 'A';// A的ASCII值为65


int b = 66;

在16bit编译器环境下,系统为a、b分别分配1个字节、2个字节的存储单元。变量存储单元的第一个字节的地址就是该变量的地址


可以看出,变量a的地址是ffc3;变量b的地址是ffc1。内存中存储的都是2进制数据

一维数组

定义的形式为:类型  数组名[元素个数]

int a[5];

int [] a; 这样写是错的 不同于java写在变量名前后都行  且定义时需要指定元素个数

初始化:

int a[2] = 8,10;

其实相当于:

int a[2];

a[0] = 8;

a[1] = 10;

元素值列表可以是数组所有元素的初值,也可以是前面部分元素的初值

int a[4] = 2,5;  这样就赋值给a[0]=2;a[1]=5;  a[2]=a[3]=默认值0


当定义并直接初始化时 可以不指定元素个数

int a[] = 2,3,5;

数组初始化时的赋值方式只能用于数组的定义,定义之后只能一个元素一个元素地赋值

int a[3];

a = 1,2,3;//错误。  因为 数组名a 代表变量的地址,是个常量,给常量赋值就错了


当数组作为实参时,因为传递的是一个地址,所以形参改变,实参也会改变

二维数组

定义形式:类型  数组名[行数][列数]

int a[2][3];//共2行3列,6个元素, 即 两个包含三个元素的一维数组


在内存中的存储情况,例如int a[2][2]


(注意:a[0]、a[1]也是数组,是一维数组,而且a[0]、a[1]就是数组名,因此a[0]、a[1]就代表着这个一维数组的地址)

1> 数组a的地址是ffc1,数组a[0]的地址也是ffc1,即a = a[0];

2> 元素a[0][0]的地址是ffc1,所以数组a[0]的地址和元素a[0][0]的地址相同,即a[0] = &a[0][0];

3> 最终可以得出结论:a = a[0] = &a[0][0],以此类推,可以得出a[1] = &a[1][0]

printf("%p\\n%p\\n%p", a, a[0], &a[0][0]);

二维数组的初始化

*   按行进行初始化

int a[2][3] = 2,2,3, 3,4,5 ;

* 按存储顺序进行初始化(先存放第1行,再存放第2行)

int a[2][3] = 2,2,3,3,4,5;

* 对部分元素进行初始化

int a[2][3] = 2, 3,4 ;

int b[3][3] = , , ,2, 1,2,3;

如果只初始化了部分元素,可以省略行数,但是不可以省略列数

int a[][3] = 1,2,3,4,5,6;

int a[][3] = 1,2,3, 3,5, ; 

为什么不能只省略列数呢? 因为int a[2][]=1,2,3,4,5,6 这样无法确定元素在哪一行

字符串简介

* 在Java中,一个字符串可以用String类型来存储

String s = "MJ";

C语言中没有String这种类型。其实字符串就是字符序列,由多个字符组成,所以在C语言中,我们可以用字符数组来存储字符串

* 字符串可以看做是一个特殊的字符数组,为了跟普通的字符数组区分开来,应该在字符串的尾部添加了一个结束标志'\\0'。

'\\0'是一个ASCII码值为0的字符,是一个空操作符,表示什么也不干。所以采用字符数组存放字符串,赋值时应包含结束标志'\\0'。

* 字符串"mj"的存储情况如下(假设用字符数组char a[]来存储):char a[] = 'm', 'j', '\\0';

注意了,尾部有个'\\0',如果没有这个结束标记,说明这个字符数组存储的并不是字符串

字符串的初始化

char a[3] = 'm', 'j', '\\0';


char b[3];

b[0] = 'm';

b[1] = 'j';

b[2] = '\\0';


char c[3] = "mj"; //“”初始化时,系统会自动在字符串尾部加上一个\\0结束符

char d[] = "mj";

char e[20] = "mj";


使用‘’初始化时,一定记得加‘\\0’,

puts函数  输出一个字符串后自动换行,一次只能输出一个字符串到‘\\0’结束

char a[]=‘a’,’b’,’\\0’; puts(a); puts(“ab”);

scanf函数

char a[10];系统会自动在尾部加上一个结束标记\\0

scanf("%s", a);因为a代表它的地址,所以不需要写成&a, 

gets函数 

系统会自动在尾部加上一个结束标记\\0

char a[10];

gets(a);  一次只能读取一个字符串 ,scanf 读取可以多个

gets可以读入包含空格、tab的字符串,直到遇到回车为止;scanf不能用来读取空格、tab

gets与scanf混用时发现:先gets再scanf没事,若先scanf再gets则gets不执行了

字符串数组简介

* 一维字符数组中存放一个字符串,比如一个名字char name[20] = "mj"

* 如果要存储多个字符串,比如一个班所有学生的名字,则需要二维字符数组,char names[15][20]可以存放15个学生的姓名(假设姓名不超过20字符)

* 如果要存储两个班的学生姓名,那么可以用三维字符数组char names[2][15][20]

字符串数组的初始化

char names[2][10] = 'J','a','y','\\0', 'J','i','m','\\0' ;


char names2[2][10] = "Jay", "Jim" ;


char names3[2][10] = "Jay","Jim" ;

字符输出函数putchar

putchar(65); // A

putchar('A'C语言试题四十二之假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串中的前导*号全部移到字符串的尾部。

C语言试题四十二之假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串中的前导*号全部移到字符串的尾部。

C语言试题四十九之只删除字符串前导和尾部的*号,串中字母之间的*号都不删除。 n 给出了字符串的长度,h字符串中前导*号的个数,e给出了字符串中最后的*个数

C语言试题四十九之只删除字符串前导和尾部的*号,串中字母之间的*号都不删除。 n 给出了字符串的长度,h字符串中前导*号的个数,e给出了字符串中最后的*个数

假定输入的字符串中只包含字母和*号。它的功能是:将字符串中的前导*号全部移到字符串的尾部。

贪心算法(入门)字典序最小问题&最小覆盖问题