一.第一个代码
1.创建一个项目:新建空项目。如果没了,可以视图——解决方案管理器
2.创建一个源文件:.c文件就是源文件,.h是头文件。右击添加——新建项——C++文件
3.写代码 4.编译运行 快捷键control+F5
1.主函数:
main函数是C语言的入口,main是函数名,大括号是函数体,int是函数返回类型,int是整型。
printf:打印函数,是库函数,使用时需要引用头文件#include
打印整数:printf(“%d\n”,100) 100按照%d整型的格式打印。
二.数据类型
float浮点数:小数
double双精度浮点型:0.00
int整型:整数
char字符类型:字母
问1:计算一下这些类型的数据所占大小:size of (谁的大小)
printf(“%d\n”,size of (char)) ;//char的大小:1Byte(字节)
问2:计算机中的单位:
bit 比特位 :可以存一个二进制位。最小单位。
byte:字节:=8bit
kb=1024byte
mb,gb
问3:为什么这么多类型?
空间利用率。
三.常量变量
int age = 20
局部变量:大括号内
全局变量:主函数外
问1:写一个代码求两个整数的和
scanf函数是输入函数
但是编译器报错,解决方法源文件加上
附1:scanf函数:通过键盘输入,给变量赋值
具体:把键盘输入的字符1,2,3,转换为输入控制符所规定格式的数据,然后存入以输入参数的地址为地址的变量中。
如果直接令i = 10,则这个i永远等于10,我们希望i的值可以由用户的键盘输入。
所以int i;
scanf("%d,&i");放进以变量i的地址为地址的变量i中。
再通过printf函数打印:
printf("i=%d\n",i);
综上:键盘上输入字符1,2,3,然后%d将这三个字符转化为十进制的数字123,放在变量i中。
四.变量的作用域和声明域
作用域:这个变量在哪里可以使用,哪里就是他的作用域。
局部变量的作用域就是其所在的范围。
如果要在不同文件中使用变量,那么应该在顶部声明这个变量
比如Test1中有int g_val,那么我要在Test2中使用的话,在Test2的顶部写extern int g_val即可使用。
生命周期:变量的创建至销毁
五.常量
1.分类:
1.字面常量:314;10;"a" 没什么意义,但存在
2.const修饰的常变量:
1)int num =10 ;num=20;打印出来是20,但是如果加上const int num =10,这个num永远是10不能被修改。
2)当int n =10 defin; int arr2[n] = {0};这样是不行的因为n是变量。但是const int n =10,这样就可以了。
3.#define定义的标识符常量。
#define Max = 10000
4.枚举常量:可以一一列举的常量(性别,星期)
enum Sex
{
MALE;
FEMALE;
SECRET;
}
枚举类型变量的未来取值(只能是这三种)
六.字符串
问1:就是一串字符,如何描述?
用双引号括起来的一串字符:“Hello”
问2:字符数组?
一组相同类型的元素:char arr[ ] = "Hello"
此时此刻在:测试——窗口——监视中:
有六个元素:最后一个 \0 是隐藏起来的。
证明:字符串在结尾的位置隐藏了一个\0的字符,这是字符串的结束标志。
问:结果是否一样?
arr1是字符串,会多一个\0。
arr2后面没有\0,所以字符串没有停止,打印出来后面的结果是未知的。所以乱码。
如果在arr2后加一个\0
打印结果为abc。
并且在计算字符串长度的时候,结束位\0不算作字符串内容。
七.转义字符
假设:在屏幕上打印:c:\code\test.c
什么原因:
转义字符转变了这个字符原有的意思
当打印 (are you ok??)的时候??)这三个字符打不出来,需要在前面加\变为\?\?)
如果想输出一个单引号,就会变成这样 ''' 是打不出来的,要转变成 ' '\ '
\ddd :printf("%c\n,'\130') 8进制的130的十进制是多少? 是88。X的ASCII码是88。打印结果是X
关于ASCII码:A:65 a:97
\xdd :printf("%c\n,'\x30') 十六进制的30的十进制是多少?是48。0对应ASCII码是48。打印结果是0。
题1:printf("%d\n,strlen("c:\test\328\test.c"));结果是多少?
\32 算一个,8算一个,因为八进制中没有8
八选择语句
if(a == 1)
printf("好好好\n");
else
printf("哈哈哈\n");
九.循环语句
显示行号:printf("写代码:%d\n”,line) ;
十.函数和数组
正常的两个数相加:
int main()
{
int num1=0;
int num2=0;
scanf("%d%d",&num1,&num2);
sum=num1+num2;
printf("d\n",sum);
return 0
}
用函数的方式解决:让Add(num1,num2)函数帮我完成这件事情:
Add (int x,int y)
{
int z =0;
z =x+y;
return z;
}
int main()
{
int num1=0;
int num2=0;
scanf("%d%d",&num1,&num2);
int sum =Add(num1,num2);
printf("d\n",sum);
return 0
}
如果变量太多:运用数组:一组相同类型元素的集合
int arr[10] = {1,2,3,4,5,6,7,8,9,10}; //十个整型数据
char ch[5] = {'a','b','c'}; //5个字符型数据,剩余的默认为0
问1:数组如何访问?
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
可以用下标访问:arr[1]就是1
问2:把数组内容全部打印出来
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
while (i
{
printf("%d",arr[i]);
i++
}
return 0;
十一. *** 作符
1.算数 *** 作符 + - * / %(取余数)
2.移位 *** 作符>>
打印%f后,第一行是4,第二行是4.5,必须要有一个是小数形式。
9余2是1。
问1:
int a =2;
int b =a //向左移动一位
printf("%d\n",b);
结果为多少?
向左移动一位,移动的是二进制位。
a是2,二进制序列是0000000 0000000 0000000 0000010 ,向左移动一位:0000000 0000000 0000000 0000100,就变成了4。
3.位 *** 作符
&与 |或 '非
4.单目 *** 作符:只有一个 *** 作数(像a+b就是双位 *** 作符)
如:!逻辑取反(12345为真,0为假)
如:& 取地址
如:sizeof。
sizeof(int);计算类型或者变量大小的。
问2:结果是多少?
是 -1。位,是二进制位,~按位取反就是把原来所有的1变成0,0变成1。(除了符号位)
0的二进制怎么表示?32个0,因为0是整型,整型是四个字节,一个字节是8个比特位。
所以00000000 00000000 00000000 00000000取反
变成了11111111 11111111 11111111 11111111
整数在内存中存储的是补码,一个整数的二进制表示有三种:1.原码2.反码3.补码
比如:-1的二进制序列:最高位写1表示是负数。(针对负数)
原码:10000000 00000000 00000000 00000001
最高位不变,其他位取反加一得补码:11111111 11111111 11111111 11111111(二进制序列中存的是补码)
如果是正数,三个码都相同。
原码变补码:最高位不变,其他位取反加一
补码变原码:减一取反
问3:a=10,b=++a的结果是什么?
b=11,a=11先++,后使用:a原来是10,++后是11,赋给b为11,此时a也是11。
问4:a=10,b=a++的结果是什么?
b=10,a=11先使用,后++
(类型)是强制类型转换
假如:int a = 3.14;
类型数据不对,这样会丢失精度。
想避免警告出现:int a = (int)3.14;// 浮点型强制转换为整型
5.逻辑 *** 作符
并且&&
或者||
6.条件 *** 作符
用条件 *** 作符表示就是:max = a>b ? a : b ;首先如果a>b,a赋值给max,否则b赋值给max
7.逗号表达式
十二.常见关键字
register 寄存器关键字
问1:计算机的数据可以存储到哪里?
内存,硬盘,网盘,高速缓存,寄存器
return 返回
signed有符号的,正负的
unsigned无符号的
static静态的
union联合体
void 空
define和include是不是?不是,他们是预处理指令。
typedef类型重定义:
typedef unsigned int uint8_t;把unsigned int 换个名字叫uint8_t
uint8_t num;他就是unsigned int num。
static
问2:结果?
十个2。正确√
如果前面加了static
结果为234567891011
static改变了a的生命周期,本质上是改变了存储类型,使其从局部变量变成了全局变量
static修饰全局变量的结果:会使这个变量只能在自己的源文件内部使用,其他.c文件不能使用 。
问3:可以用吗?
可以,要声明函数Add
如果前面加上static,那么这个函数只可以在所在文件使用了。
十三.#define定义常量和宏
define 是一个预处理指令
定义常量 #define MAX 1000;
定义宏
想要一个X+Y的加函数
#define ADD(X,Y) ((X)+(Y) ) //要这么写 ,宏是有参数的
十四.指针
内存:是电脑上的存储器,类似现实中空间的使用。现实中找到一个房间,有房门号。内存被划分成一个个有效的空间。
问1:内存如何编号?
32位系统就是32位地址线,通电,电信号转化成数字信号:1和0组成的二进制序列一共32位。一共有2的32次方个编号。这个编号就是内存的地址。
问2一.个内存是多大空间?
一个字节Byte=8bit
int a = 10; a在内存中需要分配四个字节。
此时&a,取地址a,对应四个字节,拿出第一个字节的地址。
打印地址:
对应:0055FC2C
想把取的地址存起来:用pa(指针变量)
pa = &a
问:pa的类型是什么?
int *pa // pa就是指针变量,就是用来存放地址的。
例:char ch = 'w';//字符类型的变量ch中存放的数是w。
现在要取ch的地址,然后放在pc中:
char * pc = &ch; //pc的变量类型是char,*是取ch的地址。
int a =10;
int* pa = &a; // pa中存放了a的地址
//目的是什么?是为了通过a的地址,找到a。
* pa = 20 // *pa是通过pa的地址找到a,并且赋a的值为20。*是解引用 *** 作符。
*p找到的就是num,*p就是指针变量。
总结:
指针变量的用途:(他就是一个地址,使用指针的时候就是在使用其对应的地址)
1.存地址,地址对应一个变量。
2.有朝一日通过* *** 作符找到其对应的变量。
十五.结构体
描述复杂对象:例如描述学生就是由姓名,学号,身高,体重...
struct Stu
{
char name [20];
int age;
double score;
}
然后在主函数中:
int main ()
{
struct Stu s = {"张三" , 20 , 86.3};
printf("%s%d%lf \n",s.name ,s.name,s.score); //点 *** 作符:引出结构体的成员的变量
return 0
}
还有两种打印方法:
1.如果知道的是结构体指针(s的地址):
如果把s的地址放在指针变量ps中:
struct Stu*ps=&s // ps指向s,s的类型是struct Stu
printf("%s%d%lf \n",(*ps).name ,(*ps).name,(*ps).score); //也能打印出相同的内容
2.printf("%s%d%lf \n",ps ->name ,ps ->name,ps ->score); //也能打印出相同的内容
注:->用法
结构体指针->成员变量名
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)