day1 手癌菜鸟 linux环境下学习C语言

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编译过程


宏定义


条件编译


指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值