day1 :大致说一下C语言基本知识点
( 手癌---师傅敲代码实在神速,所以觉得自己手癌 - - )
linux环境: redhat 编译器:gcc
编译时加 -Wall 提示所有警告(习惯!) 养成良好的习惯是非常重要的
C基础 常量 变量 运算符 分支语句 循环语句
数组 一维数组 字符数组(字符串) 二维数组 地址
函数 函数 函数中的变量 内存的结构 预处理命令 gcc编译过程
指针 一级指针 堆空间
二级指针(指针数组 数组指针 指向指针的指针)
函数指针 复杂表达式声明
结构体 结构体类型的定义 结构体变量 结构取成员 ...
共用体
文件
常量:不可变
123 0123 0x123
123ULL (无符号长长整形 )/8
字符常量 'a'等价与97 是一个整型数
字符串常量 "a" 是一个全局静态区中的地址
变量
int short long unsigned int unsigned long unsigned short
short int == short
signed int == int
sizeof(int) 等于机器字长 1 2 4 8
8位机 16位机 32位机64位机
sizeof(short)2 //C89 规定
sizeof(long) 4 //C89 规定
sizeof(char) 1
man ascii
'a' 'A' '0' '\n' ' ' '\0' //记住相应的ASICC值
97 65 48 1032 0
char ch = 'a';
char ch = 97;//等价
printf("%c %d\n", ch, ch);
运算符
算数运算符 + - * / %
假为0 真为1
0为假 非0为真
关系运算符 > < >= <= != ==
if ( 0 == a ) /编程习惯 万一少写一个=,a=0不会报错, 0 = a会报错:左值必须是变量逻辑运算符 && || !
expr1 && expr2
expr1 || expr2
左值 必须是变量
位运算符
& 全为1才为1
5&6==4
101
110
---
100
192.168.1.254 & 255.255.255.0
int x;
(x>>8)&255 等价与 (x&0xff00)>>8
| 全为0才为0
~ 0为1 1为0
^ 相同为0 不同为1
>> 10>>2 低位丢弃 高位补0
<< 10<<2 高位丢弃 低位补0
自增自减
a++
++a
条件运算符
a>b?a:b
逗号运算符
expr1, expr2 , expr3
逗号运算符(最低)的优先级低于赋值运算符
int a=1, b=2, c=3, d;
d= a, b, c;
printf("d=%d\n", d);
sizeof()运算符
类型名 是该类型定义的变量的长度
变量名 是该变量的长度
数组名 整个数组的长度
/test5
潜规则?
goto 不能用 (只能用于统一的错误处理)
全局变量 不能用
gets 不能用!
for( ;; ) //一般用于循环次数固定
{
;
}
while () //一般用于循环次数不固定 ///
{
;
}
do {
} while ();
//字符串数组的输入
例子: do {
buf[i] = getchar();i++;
} while ( i<BUF_SIZE && buf[i-1] !='\n' );
while (1) {
;
}
死循环的作用:
服务器 : 等待中断 等待信号 ...
c/s c:客户端 一般用windows
s:服务器端 linux
/test6
练习:
1.ABCDE五个人去钓鱼,晚上各自去休息,第二天
A先起来,将鱼分成5份,恰巧多了一条丢掉,拿走了自己的一份
B起来,将鱼分成5份,丢掉一条 拿走自己的一份
CDE都是这样的
请问:他们最少钓了多少鱼 ?
算法:穷举法 /IQ
数组:
type arr_name[常量] = {初值表};
int arr1[] = {1,2,3,4,5,6,7,8,9};
int arr1[9] = {1,2,3,4,5};
1.地址连续 2.越界 3.遍历 i=0;i<N;i++
/test8
练习:10个人站一圈,从第一个人开始数数,数到3的人退出,下一个人重新数。请问最后剩下的是第几个人。
int arr[10] = {0}; //0表示在圈里 1表示出去了
int count=0;
字符数组
字符串 '\0'
///test7
c语言没有严格的越界检查
char str1[] = {"helloworld"};
char str2[10] = {"helloworld"};/越界
char str3[10] = {'h', 'e', 'l', 'l', 'o', 'w', 'o','r', 'l', 'd'};/?
/test9
输入输出
//scanf("%s", buf);
//gets();
循环输入 scanf("%c") getchar()
for while do-while
遍历 i=0;i<N&&str[i]!='\0';i++
sizeof() strlen()
strcpy() strcmp() strcat() strchr() strstr()
strncpy() strncmp() strncat() strrchr() strlen()
要求:作业中不能包含 <string.h>
!!!!///数组名是地址常量,常量不能进行赋值之类的运算
二维数组
初值表 缺省长度
arr 与 arr[0]
二维数组定义时 int arr[3][4] ={{1,2,3},{1},{2}};/3可以省略 4不可省略 否则出现错误!
4如果缺省 则无法确定步长
地址的级别不同
arr是二级地址 通过两次*或[]运算能取出值
arr[0]是一级地址 通过一次*或[]运算能取出值
///test11
[ ] 与 *() 是一样的
地址类型:
地址强转类型 值不变 步长变了 步长:+1移动的长度
地址的类型仅仅决定步长 和值没有关系
函数:
函数的三要素:函数名 参数 返回值
函数使用的三步:声明 定义 调用
函数栈 栈帧 形参改变实参?不能
改变?实参传地址 形参提升一个级别(即加一个*)
函数名和数组名都是地址常量
函数名是函数的地址 是代码段的地址
程序的内存
代码段
全局静态区:全局变量 静态变量 常量
extern 声明全局变量
到别的文件中去找该变量的定义
变量的生存期 和 作用域
局部变量:函数开始到函数结束
函数内
全局变量:程序开始到程序结束
文件内 别的文件使用extern可以访问
静态局部变量:和全局一样
函数内
静态局部变量:和全局一样
文件内 即使用extern别的文件也不能访问
gcc编译过程
宏定义
条件编译
指针