什么是C语言? 计算机语言
二进制语言-> 汇编语言-> B语言-> C语言/C++语言
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
包含一个头文件
std-> 标准 standard input output
printf-> print function
%c-->字符格式
%p-->地址
%x-->十六进制
%f-->5位小数位
%lf-->6位小数位
内存上:(字节数)
char(1) short(2) int(4) long(4/8)
long long(8) float(4) double(8)
C语言规定:
sizeof(long) >= sizeof(int) 与平台有关
计算机中的单位:
bit-->比特位 只能存一个二进制位(0/1)
byte-->字节 1字节=8比特位
kb 1kb=1024byte
mb 1mb=1024kb
gb、tb、pb
范围:
int--> 4字节(0~2^32 -1)--32个0~32个1
short int--> 2字节(0~2^16 -1)--16个0~16个1
float weight = 96.5f;
默认是double,用f避免精度丢失
C语言规定:所有变量定义要在当前代码块的最前面
全局变量的生命周期即整个程序的周期
const int num = 4;
const--常属性
num--const修饰的常变量
本质还是变量,但具有常属性
#define max 10
int main() {
int arr[max] = { 0 };
//用法正确
}
枚举常量
enum Sex
{
MALE,
FEMALE,
SECRET
};
int main()
{
enum Sex s = FEMALE;//序号1
printf("%d\n", MALE);
printf("%d\n", FEMALE);//序号问题
printf("%d\n", s);
//MALE = 6;(x)
}
字符串-->双引号
#include<string.h>
int main()
{
char arr1[] = "abc";
char arr2[] = { 'a','b','c', };
char arr3[] = { 'a','b','c',0 };
printf("%s\n", arr1);
printf("%s\n", arr2);//没有结束标志,会出现乱码
printf("%s\n", arr3);
int i = 0;
int len = sizeof(arr2) / sizeof(arr2[0]);
for(i=0;i<len;i++)
printf("%c ", arr2[i]);
printf("\n");
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));//随机值,找'\0'
}
转义字符
#include<string.h>
int main()
{
printf("字符a:%c\n", 'a');
printf("单引号:%c\n", '\'');
printf("反斜杠:%c\n", '\\');
printf("八进制数字:%c\n", '\130x');
//\ddd-->ddd表示1~3个八进制数字:\130x
printf("长度:%d\n", strlen("c:\test\32\test.c"));//13
printf("八进制32的ASCII码值对应:%c\n", '\32');
printf("八进制32的十进制数字:%d\n", '\32');//26
//\32--32是2个八进制数字
//32作为八进制代表的那个十进制数字,作为ACSCII码值对应的字符是:
//32->十进制26;ASCII码值对应“——>”
printf("十六进制的61对应字符:%c\n", '\x61');//十六进制,对应a
printf("八进制的60对应:%c\n", '\60');//字符0--八进制\60--十进制48
return 0;
}
/*注释不支持(同类)嵌套*/
/*
//敲2w行代码
//拿到好offer!
*/
移位操作符:(2进制位)
<<左移;>>右移
位操作符:(2进制位)
&按位与 ||按位或 ^按位异或
复合赋值符:+= -= &= >> ……
单目操作符:(一个操作数)
& ! ++ ……
双目操作符
关系运算符:
> < >= <= != == ……
逻辑运算符:
&& ||
条件运算符:
exp1 ?exp2: exp3--->max = (a > b? a : b)
转义字符\0的ASCII码值是0
EOF(end of file)文件结束标志-1
~ 按位取反(2进制位)
int main() {
int a = 0;//4字节,32bit位,32个0
int b = ~a;//32个1-->-1
printf(" %d\n", b);//-1
/*负数在内存中存储的时候存的是二进制的补码
补码-1->反码->符号位不变,其余按位取反->原码
11111111_11111111_11111111_11111111(32个)
11111111_11111111_11111111_11111110(-1)
10000000_00000000_00000000_00000001(取反)-->-1
原码——反码——补码:
只要是整数,内存中存储的都是二进制的补码
整数三码相同;
*/
}
int main()
{
int a = 10;
int b = a++;//后置++,先用后加,b = 10;a = 11;
printf("a = %d, b = %d\n", a, b);
int c = ++a;//前置++,先加后用,c = 11;a = 11;
printf("a = %d c = %d\n", a, c);
}
关键字:
自动变量(一般省略):auto int a = 10;
extern ——> 引入外部符号
extern int g_val;//引入别的.c文件的变量值(要求两文件的后缀名相同)
extern int Add(int, int);//声明外部函数
register ——> 寄存器关键字
计算机存储数据可存在:
寄存器--高速缓存(70兆)--内存(4G/8G/16G)--硬盘
CPU-->中央处理器
当CPU速度越来越快时,与内存速度已远远不匹配,就让内存把数据经高速缓存放到寄存器中,
让CPU从寄存器拿数据,若拿不到,再向下找
register int a = 10;
//建议把a定义成寄存器变量,具体执行还需编译器自己判断
int == signed int//定义有符号数
unsigned int num = -1;//定义无符号数,num = 1
union ——> 联合体/共用体
typedef ——> 类型定义/类型重定义
typedef unsigned int u_int;
u_int a = 10;//起别名
static ——> 静态变量
1>static修饰局部变量a,则a的生命周期变长(a = 10,就一直等于10)
2>static修饰全局变量x,则改变了x的作用域,让静态全局变量只能在当前源文件中使用
3>static修饰函数,则改变了函数的链接属性(普通函数具有外部链接属性),变成了内部链接属性
#define ——> 定义常量和宏
#define PI 3.14;
#define MAX(X, Y) (X> Y? X: Y)
指针:
地址-->空间
如何产生地址?
以32位为例:
32位指有32跟地址线/数据线,每根有正(1)负(0)电之分,
就会产生2^32个地址和编号
以一个字节为单位划分一个内存空间
int main()
{
int a = 10;//4个字节
int* p = &a;//取地址,p是存放地址的变量
printf("%p\n", p);
printf("%p\n", &a);//二者等价
*p = 20;//改变原来变量a的值,*p就是a
//*p ——> 解引用操作符
printf("%d\n", a);
}
指针变量的大小?(只与平台有关)
在32的平台上,1个32位bit位用4字节就够了(32个bit位存放32个0/1)
在64的平台上,64bit位=8字节(64个bit位存放64个0/1)
int main()
{
printf("%d\n", sizeof(int*));
}
结构体struct
//处理复杂对象,是用户自己创建的一种类型
#include<string.h>
//类型创建在main函数之外
struct Book {
char name[20];
short price;
};
int main() {
//创建变量
struct Book b1 = { "C语言",55 };
//打印
printf("书名:%s\n", b1.name);
printf("价格:%d\n", b1.price);
//修改
b1.price = 40;
//结构体指针
struct Book* pb = &b1;
printf("%s\n", (*pb).name);
printf("%s\n", pb->name);
//操作符. -->结构体变量.成员 b1.name/(*pb).name
//操作符-> -->结构体指针->成员 pb->name
//修改书名
//由于name是数组,与price(变量)不同,
//不可用b1.name = "C++"修改,只能用拷贝strcpy
//string copy——>字符串拷贝——>库函数<string.h>
strcpy(b1.name, "C++");
}
数组名本身就是指针!
如何学好C语言?
C生万物,编程之本,母体语言
别叫苦,别喊累,别抱怨没时间!!!
学好编程,不只是C语言:
必须学好语言、算法、数据结构(DS)、系统(Linux,Windows)、
网络(网络基础、网络编程)