C总结
《1【】C程序设计(第三版) 谭浩强 209页超高清书签版》
数据类型、运算符
基本类型:
整型
字符型
实型
单精度
双精度
枚举类型
构造类型
数组类型
结构体类型
共用体类型
指针类型
空类型
整型变量是以补码的形式表示的
正数的补码与原码相同
负数的补码:将该数的绝对值的二进制形式取反再加一
Int类型:两个字节
Short int短整型:两个字节
Long 长整型:四个字节
无符号类型:不能表示负数
十六位的最大正数显然是65536(2的十六次方-1)
实型变量
有两种形式:
十进制小数
指数形式
实型变量占四个字节
实型变量按照指数形式存储
单精度占四个字节(七位有效数字)
双精度占八个字节(十六位有效数字)(实测可以达到十七位有效数字,输出为%.16f)
长双精度十六个字节
实型常数都按照双精度处理
字符常量
Int类型转化为char只用到低八位
各种数值型数据之间的混合运算
运算符
算数运算符
关系运算符
逻辑运算符
位操作运算符
赋值运算符
条件运算符
逗号运算符
指针运算符
求字节数运算符
特殊运算法:括号 下标 成员
赋值运算符
注意实型转化为整型 舍去小数部分。。
顺序结构程序设计
Printf函数
可以控制输出精度,控制浮点型数据的输出小数位数
#include<stdio.h>
Pintf()
Scanf()
Printf函数输出时,参数会从右往左计算,在输出结果
分支结构程序设计
If()
Else if()
Else
Else总是与上面最近的if配对
条件运算符和条件表达式
Int max = (a > b)?a:b;
Max = a>b?a:b
Switch语句
Switch(a)
{
Case 1:printf("%d",1);break;
Case 2:
{
}
Break;
Default:
}
Int a,b,c;
Printf("input three numbers:");
Scanf("%d %d %d",&a,&b,&c);
Int max = (a>b?a:b);
Max = c>max?c:max;
Int min =a<b?a:b;
Min = min<c?min:c;
Printf("max = %d, min = %d",max,min);
循环控制结构
While 语句
Void Main()
{
Int sum=0;
Int I =0
While(i<=100)
{
Sum+=I;
I++;
}
Sum =0;i=0
Do
{
Sum+=I;
I++;
}
While(i<=100);
}
For语句
For(int I =0; i<=100;i++)
{
sum = sum+i;
}
//循环结构
// double ind=1;
// double sum=0;
// double s=1;
// double t=0;
// do
// {
// t =s/ind;
// sum = sum + t;
//// printf("%f %.10f\n",ind,t);
// ind = ind +2;
// s =-s;
// }
// while(fabs(t) >1e-9);
// printf("ind =%f pi=%10.12f\n",ind,sum*4);
// int s;
// float n,t,pi;
// t=1,pi=0;n=1.0;s=1;
// while(fabs(t)>1e-6)
// {pi=pi+t;
// n=n+2;
// s=-s;
// t=s/n;
// }
// pi=pi*4;
// printf("pi=%10.6f\n",pi);
//循环结构
// int ind =100;
// int k ;
// int i =2;
// for(;ind<=35521;ind++)
// {
// k= sqrt(ind);
// for(i =2;i<=k;i++)
// {
// if(ind%i ==0)
// {
//// if(i)
// break;
// }
// }
// if(i>k)
// {
// printf("%d\t",ind);
// }
// // if(i)
// }
数组
数组如果不赋初值,则为随机数,
如果只有部分赋初值,剩余都为零,例如下面的
int i,a[10]={1};
如果数组的全部元素都赋初值,就不需要给出数组元素的个数,例如下面的:
//数组
int b[]={1,2,3};
for(int i=0;i<6;i++)
{
printf("%d\n",b[i]);
}
数组排序
//数组 求最大值
// int i,max,a[10];
// printf("input 10 numbers:\n");
// for(i=0;i<10;i++)
// scanf("%d",&a[i]);
// max=a[0];
// for(i=1;i<10;i++)
// if(a[i]>max) max=a[i];
// printf("maxmum=%d\n",max);
//数组 排序
// int i,j,p,q,s,a[10];
// printf("\n input 10 numbers:\n");
// for(i=0;i<10;i++)
// scanf("%d",&a[i]);
// for(i=0;i<10;i++){
// p=i;q=a[i];
// for(j=i+1;j<10;j++)
// if(q<a[j]) { p=j;q=a[j]; }
// if(i!=p)
// {s=a[i];
// a[i]=a[p];
// a[p]=s; }
// printf("%d\n",a[i]);
// }
//自己实现一遍排序
int i,j,maxind,a[10];
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i =0;i<10-1;i++)
{
maxind =i;
for( j=i+1;j<10;j++)
{
if(a[j]>a[maxind])
maxind =j;//找到最大值的序号
}
//swap ,冒泡排序
if(maxind > i)
{
int temp = a[i];
a[i] = a[maxind];
a[maxind] = temp;
}
printf("%d\n",a[i]);
}
多维数组赋初值,可以不给出第一维度的长度;
如果只有部分赋初值,剩下的都赋值为零;
int a[][3]={{2},{3,4,5},{}};
for(int i=0;i<3;i++)
{
for(int j =0;j<3;j++)
{
printf("%d\n",a[i][j]);
}
}
多维字符数组(没有赋初值的自动赋值为a)
int i,j;
char a[][5]={{'B','A','S','I','C',},{'d','B'}};
for(i=0;i<=1;i++)
{
for(j=0;j<=4;j++)
printf("%c",a[i][j]);
printf("\n");
}
printf("%c\n",a[1][4]);
字符串
字符串可以修改
char c[]="BASIC\ndBASE";
c[1]='B';
puts(c);
/字符串
// char c[]="C program";
// printf("%s\n",c);
// printf("%d\n",sizeof(c));
// char st[6];
// printf("input string:\n");
// scanf("%s",st);
// printf("%s\n",st);
// char c[]="BASIC\ndBASE";
// c[1]='B';
// puts(c);
// char st1[15],st2[]="C Language";
// strcpy(st1,st2);
// puts(st1);printf("\n");
static char st[]="C language";
int k=strlen(st);
printf("The lenth of the string is %d\n",k);
08函数
形参和实参
数组为形参时,不会重新分配空间,传递的是数组的地址
可以不给出数组元素个数
void nzp(int a[],int n)
{
int i;
printf("\nvalues of array a are:\n");
for(i=0;i<n;i++)
{
if(a[i]<0) a[i]=0;
printf("%d ",a[i]);
}
}
静态变量和全局变量存储在静态存储区
局部变量存储在动态存储区
静态局部变量只赋初值一次;
如果不赋初值,则编译时自动赋初值为零
09预处理命令
宏定义:直接做字符串替换
#define PI 3.1415926
带参数的宏
#define MAX(a,b) (a>b)?a:b
main(){
int x,y,max;
printf("input two numbers: ");
scanf("%d%d",&x,&y);
max=MAX(x,y);
printf("max=%d\n",max);
}
条件编译
10 指针
指针变量可出现在表达式中, 设
int x,y,*px=&x;
指针变量 px 指向整数 x,则*px 可出现在 x 能出现的任何地方。例如:
y=*px+5; /*表示把 x 的内容加 5 并赋给 y*/
y=++*px; /*px 的内容加上 1 之后赋给 y,++*px 相当于++(*px)*/
y=*px++; /*相当于 y=*px; px++*/
char *c;
c="asdfasdf";
c[1]='a';//这种方法是错的,要和字符数组定义的字符串区分
puts(c);
//指向数组的指针
int a[10],i,*p;
p=a;
p=&a[0];//a就是数组的首地址
for(i=0;i<10;i++)
*(p+i)=i;
for(i=0;i<10;i++)
printf("a[%d]=%d\n",i,*(p+i));
很复杂的指针操作
//指向数组的指针
int a[10],i,*p;
p=a;
p=&a[0];//a就是数组的首地址
for(i=0;i<10;i++)
*(p+i)=i;
for(i=0;i<10;i++)
printf("a[%d]=%d\n",i,*(p+i));
int *p,i,a[10];
p=a;
for(i=0;i<10;i++)
*p++=i;
p=a;
for(i=0;i<10;i++)
printf("a[%d]=%d\n",i,*p++);
指向多维数组的指针变量
//指针数组
char * c[]={{"asdfas"},{"asddddd"}};
char * p[2]={c[0],c[1]};
puts(p[1]);
int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
int(*p)[4];
p =a;
printf("%2d ",p[2][1]);
字符串指针与字符数组的区别
函数指针变量
指针数组
//指针数组
char * c[]={{"asdfas"},{"asddddd"}};
char * p[2]={c[0],c[1]};
puts(p[1]);
指针运算总结
11结构体和共用体
动态存储分配
//动态内存分配
int *p=calloc(2,sizeof(int));
p[0]=9;
p[1]=22;
printf("%d %d\n",p[0],p[1]);
链表
//链表
struct mem
{
int num;
int age;
struct mem* next;
};
struct mem * create(int n)
{
struct mem* head =NULL;
struct mem* now =NULL;
int i;
for(i=0;i<n;i++)
{
if(i ==0)
{
head = malloc(sizeof(struct mem));
head->num =i;
head->age =i;
head->next =NULL;
now = head;
}
else
{
now->next =malloc(sizeof(struct mem));
now = now->next;
now->num =i;
now->age =i;
now->next=0;
}
}
return head;
}
struct mem* hh =create(3);
struct mem* pp =hh;
while(pp)
{
printf("%d",pp->age);
pp=pp->next;
}
枚举类型
//枚举类型
// enum week{monday,tue,wed,thur,fri};
// enum week a;
// a=monday;
// b = (enum week)1;//可以强制类型转换
enum body
{ a,b,c,d } month[31],j;
int i;
j=a;
for(i=1;i<=30;i++){
month[i]=j;
j++;
if (j>d) j=a;
}
for(i=1;i<=30;i++){
switch(month[i])
{
case a:printf(" %2d %c\t",i,'a'); break;
case b:printf(" %2d %c\t",i,'b'); break;
case c:printf(" %2d %c\t",i,'c'); break;
case d:printf(" %2d %c\t",i,'d'); break;
default:break;
}
}
printf("\n");