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");

 

posted @ 2020-11-24 01:30  tmjDD  阅读(110)  评论(0编辑  收藏  举报