文章结构:
赋值定义运算语句
格式化输入输出语句
符号常量:#define 标识符 常量值
两种 while 语句 && switch语句
数组 && 字符串
指针
动态内存分配
指针处理链表
typedef 声明新类型
注:部分内容省略了,适用于学过C语言或其他语言的读者阅读
赋值定义运算语句
运算规则
先运算,再取值
++a
a取值后,a的值再自增1
a++
与或非
(&& || !)
注意:在定义中不允许连续赋值,如int a=b=c=5;是不合法的。
格式化输入输出语句
格式化输出语句,也可以说是占位输出,是将各种类型的数据按照格式化后的类型及指定的位置从计算机上显示。
其格式为:printf(“输出格式符”,输出项);
相应的输出语句 : scanf(“输入格式符如%f”,&a); //&取地址符号
格式符 | 说明 | 举例 |
---|---|---|
%d | 带符号十进制整数 | jint a=10; printf("%d",a);输出结果为10 |
%c | 单个字符 | char x=‘a’ :;printf("%c", x);输出结果为a |
%s | 字符串 | print("%s",慕课网);输出结果为其课网 |
%f | 6位小数 | float a=123; printf("%f", a):输出结果为123.0000 |
符号常量:#define 标识符 常量值
#include <stdio.h>
#define POCKETMONEY 10 //定义常量及常量值
int main()
{
// POCKETMONEY = 12; //小明私自增加零花钱对吗?
printf("小明今天又得到%d元零花钱\n", POCKETMONEY);
return 0;
}
两种 while 语句 && switch语句
while (表达式)
{
执行代码块
}
do
{
执行代码块
} while(表达式);//注意分号
它先执行循环中的执行代码块,然后再判断while中表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while循环至少要执行一次循环语句。
switch(表达式) {
case 常量表达式1: 执行代码块1 break; //在case子句后如果没有break;会一直往后执行一直到遇到break;才会跳出switch语句。
……
case 常量表达式n: 执行代码块n break;
default:执行代码块nt1;//default子句可以省略不用。
}
数组 && 字符串
int arr[3] = {1,2,3};
int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}};
C语言的数组长度一经声明,长度就是固定,无法改变,并且C语言并不提供计算数组长度的方法。
c语言获取数组长度:
int length = sizeof(arr)/sizeof(arr[0]);
C语言中,是没有办法直接定义字符串数据类型的,但是我们可以使用数组来定义我们所要的字符串。一般有以下两种格式:
char 字符串名称[长度] = "字符串值";
char 字符串名称[长度] = {'字符1','字符2',...,'字符n','\0'};
[]中的长度是可以省略不写的;
采用第2种方式的时候最后一个元素必须是’\0’,’\0’表示字符串的结束标志;
字符串函数
函数 | 说明 | 举例 |
---|---|---|
strlen(s) | 获得字符串的长度(单位字节) | strlen(“abc”),结果:3 |
strcmp(s1, s2) | 比较字符事 | strcmp(" ab’,“ac”),结果-1 |
strcpy(s1, s2) | 字符事拷贝 | strcpy(s1," abc ’ ) |
strcat(s1, s2) | 把字符事s2拼接到字符事sl后 | strcat(sl. “abc”) |
指针
指针变量
# include<stdio.h>
void main()
{
inta a=100;int b=50;
int *p1,int *p2;
p1=&a;p2=&b;
printf("*p1=%d,*p2=%d\n",*p1,*p2);//费定义时,加*表示地址a指向的变量,*&a=a
}
指针类型:
整形指针 int*
浮点指针 float*
用指针引用数组:
int *p=&a[0];or int *p=a;
数组名代表数组首元素的地址(所以函数参数为数组时):
int arr[3] = {1,2,3};
int jieguo=funcion(arr);//注意参数的传递
int function( int a[3])
{
return a[0];
}
在指针指向数组元素时,可对指针进行运算;
p++ p=p+1
p1-p2(计算间隔元素个数)
how about 二维数组?
a表示0行0元素地址
p++ p=p+1 表示下一行地址
*(a+1)+2===&a[1][2]
int (*p)[4];//指针p执、指向含有4个整型元素的一维数组
动态内存分配与指向它的指针变量:
什么是内存的动态分配
malloc =memory allocation (中文:动态内存分配)
第7章介绍过全局变量和局部变量,全局变量是分配在内存中的静态存储区的,非静态
的局部变量(包括形参)是分配在内存中的动态存储区的,这个存储区是–个称为栈(stack)
的区域。除此以外,C语言还允许建立内存动态分配区域,以存放一些临时用的数据,这些
数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不
需要时随时释放。这些数据是临时存放在一个特别的自由存储区.称为堆(heap)区。可以
根据需要,向系统申请所需大小的空间。由于未在声明都分定义它们为变量或数组,因此不
能通过变量名或数组名去引用这些数据,只能通过指针来引用。
#include<stdlib.h>
void *malloc(unsigned int size)
malloc(100);//开辟100个字节的临时分配域,函数值为其第一个字节的地址
注意指针的基类型为void,即不指向任何类型的数据,只提供一个地址。如果因内存不足等原因为能分配返回null空指针
void *calloc(unsigned n,unsigned size)
int p;
p=calloc(50,4)//开辟504字节的临时分配域,并把起始的地址付给指针变量p
void free (void *p)
free§;
malloc的返回类型:void指针类型
指向void类型=指向空类型=不指向确定的类型
int *p1;
p1=(int*)malloc(5*sizeof(int));//将地址转为*int型,然后放在p1中
p1=malloc(5*sizeof(int));//自动转换
结构体类型:struct 结构体名{成员列表};
num | name | sex | age | score |
---|
strcut Student
{
int num;
char name[20];
char sex;
cahr age;
float score;
};
结构体变量:
struct Student LiMing ,Janny;
LiMing ={1,“liming”,“male”,18,100}
Janny.num=LiMing .num+1;
Janny.name=“jenny”;
结构体指针 与 指向运算符->:
struct Student *p;
(*p).num==p->num
p->num表示p指向的结构体变量中的num成员
(*p).num=3; //赋值
指针处理链表:struct 结构体名{成员列表 struct 结构体名 *next;};
静态链表:
int main()
{
struct 结构体名 a,b,c,*head,*p;
[对a,b,c进行赋值]
head=&a;
a.next=&b;
b.next=&c;
c.next=null;
p=head;
do
{
[输出p所指向的结构体的内部数据]
p=p->next;//使p指向下一个节点
}while(p!=null)
}
动态链表:
int main()
{
struct 结构体名 *p1,*head,*p2;
p1=p2=(struct 结构体名)malloc(LEN);
[对p1进行赋值//输入1号的数据]
head=p1;
while(p1->num!=0//停止标志)
{
p2->next=p1;
p2=p1;
p1=(struct 结构体名)malloc(LEN);
[对p1进行赋值//输入n号的数据]
}
p2->next=null;
return head;
}