1.main函数
main函数是程序的入口
一个工程中main函数有且仅有一个
#include <stdio.h>
int main()
{
printf("Hello World!");
return 0;
}
2.数据类型
char 字符数据类型
short 短整形
int 整形
long 长整形
long long 更长的整形
float 单精度浮点数
double 双精度浮点数
下面为数据类型64位计算机对应字节大小 sizeof()用于计算字节大小
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(char));//1
printf("%d\n", sizeof(short));//2
printf("%d\n", sizeof(int));//4
printf("%d\n", sizeof(long));//8
printf("%d\n", sizeof(long long));//8
printf("%d\n", sizeof(float));//8
printf("%d\n", sizeof(double));//8
printf("%d\n", sizeof(long double));//16
return 0;
}
32位计算机
long为4个字节
指针
32位:4 64位:8
3.变量和常量
(1)定义变量
#include <stdio.h>
int main()
{
int age=18;
float weight=50.5;
char ch='w';
return 0;
}
(2)变量的分类
全局变量
局部变量
#include <stdio.h>
int global = 2022;
int main()
{
int local = 2021;
int global = 2020;
printf("global = %d\n", global);
return 0;
}
第一个global为全局变量
第二个global为局部变量
当局部变量和全局变量同名的时候 局部变量优先使用
尽量多的使用局部变量
(3)变量的使用
输入和输出
#include<stdio.h>
int main()
{
int input=0;
printf("加入比特\n");
printf("你要好好学习吗?(1/0)");
scanf("%d",&input);//1/0
if(input==1)
printf("好offer");
else
printf("卖红薯\n");
return 0;
}
#include <stdio.h>
int main()
{
char ch='A';
printf("%c\n",ch);
return 0;
}
%c 打印字符
%d 打印整型十进制数据
%f 打印浮点数字-打印小数
%p 以地址的形式打印
%o 打印8进制数字
%x 打印16进制数字
两个数求和
#include <stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", &num1, &num2);
sum = num1 + num2;
printf("sum = %d\n", sum);
return 0;
}
(4)变量的作用域和生命周期
作用域
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用 的 而限定这个名字的可用性的代码范围就是这个名字的作用域。
1. 局部变量的作用域是变量所在的局部范围。
2. 全局变量的作用域是整个工程。
生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
2. 全局变量的生命周期是:整个程序的生命周期。
(5)常量
1000;
//字面常量
#define MAX 100
//define定义常量
enum Sex
{
male,
female,
secret
};
//枚举常量
//枚举常量的默认是从0开始,依次向下递增1的
const float pai = 3.14f;
//这里的pai是const修饰的常变量
4.字符串 转义字符
(1)计算字符串(重点)
#include <stdio.h>
int main()
{
char arr1[]="abc";//数组
char arr2[]={'a','b','c','\0'};// \0为字符串结束标志 不加会输出随机值
printf("%s\n",arr1);//%s打印字符串
printf("%s\n",arr2);
return 0;
}
#include <stdio.h>
int main()
{
char arr1[]="abc";
char arr2[]={'a','b','c'};
printf("%d\n",strlen(arr1));
//3已知 strlen计算字符串长度
printf("%d\n",strlen(arr2));
//未知 无\0 \0为结束标志 不算字符串长度
printf("%c\n",'\32');
//32作为八进制数字转化成十进制数字后所代表的ASCII码值对应的字符
//32十进制为26 26作为ASCII码值
printf("%c\n",'\x61');
//61作为16进制数字转化成十进制数字后所代表的ASCII码值对应的字符
return 0;
}
\0为字符串结束标志
当"abc" \0默认有 不写出来
当'a','b','c' \0没有
(2)转义字符
#include <stdio.h>
int main()
{
printf("abc\n");//、
printf("c:\\test\32\\test.c");
//\t水平制表符
printf("%c\n",'a');
//打印字符a
printf("%c\n",'\'');
//打印单引号 加\ 转义变为普通单引号
printf("%s\n","\"");
//加\防止23双引号配对
//??+)三字母词会解析成花括号 想正常输出?在前加\转义
//想正常打印 再加\
return 0;
}
小题一练(可以尝试一下)
#include <stdio.h>
int main()
{
printf("%d\n", strlen("abcdef"));
printf("%d\n", strlen("c:\test\628\test.c"));
return 0;
}
答案:6和14
解析:
第一行打印abcdef的长度 默认有\0 \0不计入字符串的长度 打印结果为6
第二行打印 \t为一个字符 \62也为一个字符 8进制形式 数一下 打印结果为14
5.注释
c语言注释 /*xxxxxx*/
不能嵌套注释 可以同时注释多行
c++注释 //xxxxxx
可以注释一行也可注释多行
6.选择语句(if语句简单介绍)
#include <stdio.h>
int main()
{
int coding = 0;
printf("你会去敲代码吗?(选择1 or 0):>");
scanf("%d", &coding);
if(coding == 1)
{
prinf("坚持,你会有好offer\n");
}
else
{
printf("放弃,回家卖红薯\n");
}
return 0;
}
if else
if和else后一条语句 可不加大括号 多条语句 需要加大括号
if(条件判断)
条件判断为真 执行if内的语句
条件判断为假 执行else内的语句
7.循环语句(while语句简单介绍)
#include <stdio.h>
int main()
{
int i=0;
while(i<10000)
{
printf("emo\n");
i++;
}
return 0;
}
如果你很emo
这样会输出一万行emo
i会加到10000跳出循环
while(判断条件)
8.函数
#include <stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", &num1, &num2);
sum = num1 + num2;
printf("sum = %d\n", sum);
return 0;
}
//上述代码,写成函数如下:
#include <stdio.h>
int Add(int x, int y)
{
int z = x+y;
return z;
}
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", &num1, &num2);
sum = Add(num1, num2);
printf("sum = %d\n", sum);
return 0;
}
函数可以让代码可以反复使用
9.数组
int arr[10]={1,2,3,4,5,6,7,8,9,0};//定义整形数组 最多10个元素
数组通过下标来访问元素 下标从0开始
元素:1 2 3 4 5 6 7 8 9 0
下标:0 1 2 3 4 5 6 7 8 9
遍历一维数组(打印一维数组的所有元素)
#include<stdio.h>
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};//定义一个存放10个整数数字的数组
//char ch[20]; 下标是从0开始 依次递增
//float arr2[5]; 等等 数组定义
printf("%d\n",arr[4]);//打印第5个元素 下标为4
int i=0;//while语句
while(i<10)
{
printf("%d ",arr[i]);
i++;
}
}
利用循环可访问所有下标对应的元素
10.操作符
#include<stdio.h>
int main()
{
int a=1;
//移位操作符 移2进制
//1整型占4个字节 32bit位
//000000000000000000000000000000001 31个0
int b=a<<2;//<<左移 >>右移 左移后后面补0
printf("%d\n",b);
//左移右移不改变a的值 a还是为1
//b的值为1*2*2=4
return 0;
}
//位操作 2进制
//& 按位与
//| 按位或
//^按位或与
int a=3; //011int b=5; //101
int c=a&(|)(^)b;如何判断真假
非0为真
0为假
//001按位与 同时为真就为真
//111按位或 同时为假才为假
//110按位或与 相同为0 相异为1
printf("%d\n",c);//所以输出为1
//所以输出为7
//所以输出为6
int a=10;
a=2;//=赋值 ==判断相等
a=a+10;//写法1
a+=10;//写法2 a=12等同 简便
a=a-20;//写法1
a-=20//写法2
a=a&2//写法1
a&=2//写法2
单目操作符
//计算数组元素个数 数组总大小/每个元素大小
int arr[10]={0};
int sz=0;
printf("%d\n",sizeof(arr));
sz=sizeof(arr)/sizeof(arr[0]);
printf("sz=%d\n",sz);
关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
逻辑操作符
&& 逻辑与
|| 逻辑或
条件操作符
exp1 ? exp2 : exp3
条件1成立 执行条件2 条件1不成立 执行条件3
逗号表达式
exp1, exp2, exp3, …expN 看最后一个表达式 中间表达式的数据变化要计算
下标引用、函数调用和结构成员
[ ] ( ) . ->
#include<stdio.h>
int Add(int x,int y)
{
int z=0;
z=x+y;
return z;
}
int main()
{
//int arr[10]={0};
//arr[4];//[]-下标引用操作符
int a=10;
int b=20;
int sum=Add(a,b);//()--函数调用操作符
printf("sum=%d",sum);
return 0;
}
//只要是整数 内存中存储的都是二进制的补码
//正数--原码 反码 补码 相同
//负数:
//原码 反码 补码
//直接按照正负 原码的符号位(最高位)不变 反码+1
//写出的二进制序列 其他都按位取反
11.关键字
auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while
(1)typedef
类型重命名
typedef unsigned int uint_32//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名
typedef 类型1 类型2 //类型1和类型2一样 换了个名字
unsigned int num1=0;
uint_32 num2=0;
两个变量的类型是一样的
(2)static
在C语言中: static是用来修饰变量和函数的
1. 修饰局部变量-称为静态局部变量
2. 修饰全局变量-称为静态全局变量
3. 修饰函数-称为静态函数
下面两个代码输出什么 可以尝试一下
代码1
#include <stdio.h>
void test()
{
int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for(i=0; i<10; i++)
{
test();
}
return 0;
}
代码2
#include <stdio.h>
void test()
{
//static修饰局部变量
static int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for(i=0; i<10; i++)
{
test();
}
return 0;
}
代码1
打印10个1
代码2
打印 1 2 3 4 5 6 7 8 9 10
有static i就不会每次被初始化为0 保留上一次结果
无static i就会每次被初始化为0 因此最后打印一直为1
结论:
static修饰局部变量改变了变量的生命周期
让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
如果static修饰全局变量和函数 会怎么样呢?
一个全局变量被static修饰 使得这个全局变量只能在本源文件内使用 不能在其他源文件内使用
一个函数被static修饰 使得这个函数只能在本源文件内使用 不能在其他源文件内使用
13.指针
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
#include <stdio.h>
int main()
{
int num = 10;
#//取出num的地址
//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
printf("%p\n", &num);//打印地址,%p是以地址的形式打印
return 0;
}
int num = 10;
int *p;//p为一个整形指针变量
p = #
#include <stdio.h>
int main()
{
int num = 10;
int *p = #
*p = 20;
return 0;
}
指针变量的大小
指针大小在32位平台是4个字节,64位平台是8个字节。
14.结构体
struct Stu
{
char name[20];//名字
int age; //年龄
char sex[5]; //性别
char id[15]; //学号
};
//打印结构体信息
struct Stu s = {"张三", 20, "男", "20180101"};
//.为结构成员访问操作符
printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);
//->操作符
struct Stu *ps = &s;
printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps->id);
#1初识c语言#完