C语言基础学习

C语言基础学习

写程序的步骤

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=0int *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;
}

你可能感兴趣的:(C/C++学习,c语言,物联网,linux)