1、编辑源代码
2、将源代码编译成可执行程序 gcc
3、执行
4、调试
jitang.c
#include
int main(int argc,char **argv){
printf("鸡汤来了,嘿嘿嘿!\r\n");
return 0;
}
源文件:C语言文件后缀必须是.c
头文件:stdio.h 是头文件(head)
int
short int
long int
char 字符型变量 0~255表示字符 ASCII码
1,2,3,a,b,c,+,-
char ch='A';
printf("%d,%c\n",ch,ch); //输出不一样 65 A
ch+=5;
有符号数和无符号数
数组初始化
int a[5]={};
int b[3]={0,0,0};
int c[2]; //未初始化
不同类型的数组
int a[3]; 4B
float a[3]; 4B
double a[3]; 8B
char a[3]; 1B //(不同电脑可能不同?)
sizeof() //查看变量或数据类型的字节数
char ch[]={'a','b','c'};
char ch[3]={97,98,99};
char ch[3]={'a','b','c'}; //单引号括着单个字符
sizeof(ch) //3个字符
char ch[]="abc"; //用双引号是字符串
sizeof(ch);
//4个字符 ,最后一个是个"\0"在ASCII第一个位置,
//是个空字符,是字符串结束符
#include
int main(void){
int a=0;
int *p; /* *代表指针符号,在定义和指针操作的
时候是不一样的,定义的时候说明是为了告诉编译器p
是一个指针,指向一个int型变量*/
p=&a; //取地址符,将a的地址赋值给p
*p=2;
/**
a代表变量a本身;
p代表指针变量p本身
&a代表a的地址
*p代表指针变量p指向的那个变量a
*/
printf("a=%d",a);
return 0;
}
#include
int main(void){
//(1)
int a=0;
int *p;
p=&a;
//(2)
int a=0;
int *p=&a;
/***
int a=0;
int *p;
*p=&a; 错误的初始化
*/
/**
int *p;
int* p;
int * p;
三者之间效果是一样的
*/
return 0;
}
#include
int main(void){
int a[]={1,2,3,4,5,,6};
int *p1;
int *p2;
int *p3;
p1=&a; //编译报警告,但是能通过无误
p2=a; //通过且无误无警告
p3=&a[0]; //通过且无误无警告
//数组名a在赋值符右边时代表数组首元素的首地址a等同于&a[0]
//&a表示数组的首地址 数组首地址和数组首元素的地址数值上一样
//的但是意义不一样,就比如一个村的首个门牌号和第一家的门牌号
printf("%d\n",*p1);
printf("%d\n",*p2);
printf("%d\n",*p3);
//数组访问的第二种方式
printf("%d\n",*(p1++)); //等于*p1++,输出为1,为什么是1,
//是因为++在后,是先执行再++
*++p1;
printf("%d\n",*p2); //输出为2,为什么是2,
//是因为++在前,是先++再执行
printf("%d\n",++(*p3)); //输出为2,是a[0]+1
return 0;
}
//数组名a在赋值符右边时代表数组首元素的首地址a等同于&a[0]
//&a表示数组的首地址 数组首地址和数组首元素的地址数值上一样
//的但是意义不一样,就比如一个村的首个门牌号和第一家的门牌号
数组名是常量不是变量,不能做左值。
指针本身是一种变量类型,可以进行运算,但是由于存储的是变量的
地址,因此* /%这些运算时无意义的,而+1,-1是有意的,可以代表下一个地址,和上一个地址
++优先级和*一样高,*p++从右向左执行,所以先p++
为什么需要指针?
指针存在的目的就是间接访问! 比如一个函数里的一个形参是一个int a[255]如果不用指针,则这个参数需要传入一个int类型的255个变量的数组
交换函数:
#include
void swapPoint(int *a,int *b);
void swap(int a,int b);
int main(void){
int a=1,b=2;
int *p;
p=&a;
printf("before swap a=%d,b=%d\r",a,b);
swap(a,b);
printf("after swap a=%d,b=%d\r",a,b);
swapPoint(&a,&b);
/*之前不太理解int *a,int *b
如果要传参不应该传 *a,*b这样吗,为要传&a,&b。现在
我理解的是,形参int *a,int *b表示要传递的是一个指
针变量,而谁是指针变量,a不是指针变量,是int型变
量,*p不是指针变量!他是一个int型的值,而非指针变
量,p是一个指针变量,同样p里面的值是指针地址,所以
&a也是指针变量,也就是地址值。
所以我们可以传&a,也可以传p,但是不能传*p!
*/
printf("after swapPoint a=%d,b=%d\r",a,b);
return 0;
]
void swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
printf("swap函数里更改之后的 a=%d,b=%d\r",a,b);
}
void swapPoint(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
printf("swapPoint函数里更改之后的a=%d,b=%d\r",*a,*b);
}
之前不太理解int * a,int * b如果要传参不应该传 a,b这样吗,为要传&a,&b。现在 我理解的是,形参int * a,int * b表示要传递的是一个指针变量,而谁是指针变量,a不是指针变量,是int型变量, * p不是指针变量!他是一个int型的值,而非指针变量,p是一个指针变量,同样p里面的值是指针地址,所以&a也是指针变量,也就是地址值。所以我们可以传&a,也可以传p,但是不能传 * p!**
C语言中函数一直传递的是实参的复制值,并不是实参的本身,而使用指针是将实参的地址传递过去了
为什么有结构体,因为数组虽然可以存储多个数据,但是数组只能存储相同的类型的数据。而结构体可以存储不同类型的数据,类似于把有关系的几个不同数据类型的变量封装打包成一个变量。
#incude
//结构体只是一个模子,并不是实际的值
//结构体在main函数外面定义,所以是全局变量
struct Student
{
unsigned int ID;
char sex;
string name;
int class;
};
int main(void){
struct Student student;
//结构体初始化
//定义之后再赋值
student.ID=20197;
student.name="mahaha";
student.sex='m';
student.class=6;
//直接定义赋值
struct Student s={222,'w',"maheihie",6};
struct Student s1={
.ID=223;
.sex='m';
.name="jjj";
.class=6;
};
printf("name=%s,ID=%d,sex=%s,class=%d",student.name,student.ID,student.sex,student.class);
return 0;
}
#include
union Student{
int a;
char b;
};
int main(void){
union Student s;
s.a=2; //试试给s.a赋不同的值,s.b的值有什么特点
printf("s.a=%d,s.b=%f",s.a,s.b);
return 0;
}
共用体在定义和使用形式上除了关键字不一样,其他和结构体很相似。但是两者是完全不同。
结构体是多种数据打包封装的东西。
共用体是共用体有不同的数据类型,但最终用的时候是根据自己的需求使用一种数据类型。 多选一
#include
struct Male{
int age;
string name; //没有string?
int ball;
};
struct Female{
int age;
string name; //没有string?
int face;
};
union Student{
struct Male m;
struct Female f;
};
int main(void){
union Student s;
s.m.ball=9;
s.f.face=24;
return 0;
}
#include
#define MAX 55
#define PI 3.1415926
#define S(r) (PI*r*r)
int main(void){
int a;
a=MAX;
printf("a=%d",a);
return 0;
}
一般宏定义在main函数外面
宏定义要在使用前定义
宏定义一般变量名为大写
为什么要使用宏定义?
一般都把常量定义为宏定义,方便代码维护,当改常量值时,直接改宏定义就行,不必一个一个改。
#include
enum Week{
SUN, //默认起始值是0
MON,
WEN,
THU,
THE,
FRI,
SAT
};
int main(void){
enum Week today;
today=THU;
printf("today=%d",today);
return 0;
}