开学的第十二个晚上,3月21号
谭浩强的书快完结了,加油啊,楼主,到链表了come on!!!!!
//在编译时u,编译系统为函数代码分配一段储存空间,这段储存空间的起始地址(入口地址)称为这个函数的指针
/*运行出错******************************************************************
int main()
{int max(int ,int );
int a,b,c;
printf("please enter a and b:");
scanf("%d,%d",&a,&b);//出错原因 ,scanf输入时应以英文逗号间隔 ,习惯与空格间隔导致出错
c=max(a,b);
printf("a=%d\n b=%d\n max=%d\n",a,b,c);
return 0;
}*//*
int max(int x,int y)
{int z;
if(x>y) z=x;
else z=y;
return (z);
}
int main()
{//主题*p两侧的括号可以省略
int(*p)(int,int);//定义指向函数的指针·变量p
int a,b,c;//函数名代表函数的入口地址
p=max;//使指向函数的指针的变量p指向max函数·(该函数的起始地址)
printf("please enter a and b:");//p=max作用就是将汗水max的入口地址赋给指针变量
scanf("%d,%d",&a,&b);
c=(*p)(a,b);//通过指针变量调用max函数
printf("a=%d\nb=%d\nmax=%d\n",a,b,c);
return 0;
}*//*
void fun(int x,int y,int(*p)(int,int))//声明形参p是指向函数的指针
{
int result;//结果
result=(*p)(x,y);//
printf("%d\n",result);//打印返回值
}
int max(int x,int y)//undeclared identifier 未定义标识符
{int z;
if(x>y)z=x;
else z=y;
printf("max=");
return (z);//将返回值返回给result
}
int min(int x,int y)
{int z;
if(x<y)z=x;
else z=y;
printf("min=");
return (z);
}
int add(int x,int y)
{int z;
z=x+y;
printf("sum=");
return(z);
}
int main()
{
int a=34,b=-21,n;
printf("please choose 1,2or3:");
scanf("%d",&n);
if(n==1) fun(a,b,max);//此时fun函数的形参p指向max函数
else if(n==2)fun(a,b,min);
else if(n==3)fun(a,b,add);
return 0;
}*/
/*float *search(float(*pointer)[4],int n)//形参pointer是指向一维数组的指针变量
{float*pt;
pt=*(pointer+n);//pt的值是&score[k][0]
return(pt); //*(p+2)+0表示a[2]+0 也就是a[2][0]元素的地址*(*(p+2)+0)就是a[2][0]的值
}
int main()
{float score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};
float*p;
int i,k;
printf("enter the number of student:");
scanf("%d",&k);
printf("The score of No.%d are:\n",k);//score得分 No numero数目,号码
p=search(score,k);
for(i=0;i<4;i++)//打印数组的一行
printf("%5.2f\t",*(p+i));//,\t 就相当于你在编程的时候按一下“Table”键,使光标以8个字符为基准进行跳跃 。
printf("\n");
return 0;
}*//*
float *search(float(*pointer)[4])//定义形参pointer是指向一维数组的指针变量
{int i=0;//
float *pt;
pt=NULL;//先使pt值为空
for(;i<4;i++)
if(*(*pointer+i)<60) pt=*pointer;//score[0][i]检测不及格 使pointer指向a[i][0]
return(pt);
}
int main()
{float score[][4]={60,70,80,90,56,89,67,88,34,78,90,66};
float*p;
int i,j;
for(i=0;i<3;i++)//*(score+i)就是i行o列的地址
{p=search(score+i);//调用search函数,如果有不及格返回score[i][0]的地址,否则返回NULL(空)
if(p==*(score+i))//pt=*pointer;
{printf("No.%d score:",i);
for(j=0;j<4;j++)
printf("%5.2f ",*(p+j));//输出score[i][0]~score[i][3]
printf("\n");
}
}return 0;
}*/
//若一个数组,其元素均为指针类型的数据,称为指针数组
//int*p[4]代表指针数组
//int(*p)[4]代表指向一维数组的指针变量
/*字符串比较大小的规则
以字符是ASCII值确定,比较规则是,从第一个字符开始,顺次向后直到出现不同的字符为止
然后以第一个不同的字符的ASCII值确定,
*//*strcmp编辑
C/C++函数,比较两个字符串。
设这两个字符串为str1,str2,
若str1==str2,则返回零;
若str1>str2,则返回正数;
若str1<str2,则返回负数
*//*
#include<string.h>//字符串处理图文件
void sort(char*name[],int n)//n=5
{char*temp;
int i,j,k;
for(i=0;i<n-1;i++)//i<4
{k=i;
for(j=i+1;j<n;j++)
if(strcmp(name[k],name[j])>0) k=j;
if(k!=i)
{temp=name[i];name[i]=name[k];name[k]=temp;}
}
}
void print(char*name[],int n)
{int i;
for(i=0;i<n;i++)//按指针数组元素的顺序输出他们所指向的字符串
printf("%s\n",name[i]);
}
int main()
{
char*name[]={"Fllow me","BASIC","Great wall","FORTRAN","Computer design"};
int n=5; //定义指针数组,他的元素分别指向五个字符串·
sort(name,n);
print(name,n);
return 0;
}*/
// *运算符的结合性是从右向左 指向指针数据的指针变量,简称为指向指针的指针
//char**p相当于char*(*p) (*p)表示指针变量 char*表示p指向char*的数据
/*int main()
{char*name[]={"Fllow me","BASIC","Great wall","FORTRAN","Computer design"};//定义指针数组,他的元素分别指向五个字符串·
char**p;//p是指向char*型数据的指针变量
int i;
for(i=0;i<5;i++)
{p=name+i;//第一次执行p指向name[0]
printf("%s\n",*p);
}
return 0;
}*//*
int main()
{int a[5]={1,3,5,7,9};
int*num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};
int**p,i;//p是指向指针型数据的指针变量
p=num;
for(i=0;i<5;i++)
{printf("%d ",**p);
p++;
}
printf("\n");
return 0;
}*/
//指针就是地址,指针变量是用来存放地址的变量
//vc中memory中出现CD的都是被占用申请的空间
/*全局变量和全局静态变量的区别
a)若程序由一个源文件构成时,无区别
b)全局静态变量对组成该程序的其他源文件是无效的
c)具有外部链接的静态:可以在所有的源文件里调用,除了本文件,其他文件可以通过extern的方式引用*/
//在全局变量前面加一个static,则该变量只在这个源文件中可用,称为全局静态变量
//malloc其作用是在内存的动态储存区中分配一个长度为size的连续空间,形参size为无符号整形(非负)
//calloc其作用是在内存的动态储存区中分配n个长度为size的连续空间
//free其作用是释放指针变量p所指向的动态空间
//realloc,如果已经通过malloc和calloc函数获得了动态空间,改变其大小。用realloc函数重新分配/
//void型指针吧指向任何数据
//当吧void指针赋值给不同基类型指针变量是,编译系统会自行转换,不必用户强制转换
/*#include<stdlib.h>
void check(int*p)
{int i;
printf("They are fail:");
for(i=0;i<5;i++)
if(p[i]<60) printf("%d ",p[i]);
printf("\n");
}
int main()
{int*p1,i;
p1=(int*)malloc(5*sizeof(int));//开辟动态内存区,将地址转换为int*型,然后放在p1中
for(i=0;i<5;i++)
scanf("%d",p1+i);
check(p1);
return 0;
}*//*
struct Student
{long int num;
char name[20];
char sex;
char addr[20];
}a={10101,"LiLin",'M',"123NiMaRoad"};//定义结构体变量并初始化
int main()
//%ld 输出的字节要长点 %d 的要短点。比如,一个数大于32767 用%d 就要溢出。
//%c格式对应的是单个字符,%s格式对应的是字符串
{printf("No.:%ld\nname:%s\nsex:%c\naddres:%s\n",a.num,a.name,a.sex,a.addr);
return 0;
}*//*
struct Student
{int num;
char name[20];
float score;
}student1,student2;//定义两个结构体变量student1,student2
int main()
{
scanf("%d%s%f",&student1.num,student1.name,&student1.score);
scanf("%d%s%f",&student2.num,student2.name,&student2.score);
printf("The higher score is:\n");
if(student1.score>student2.score)
printf("%d %s %6.2f\n",student1.num,student1.name,student1.score);
else if(student1.score>student2.score)
printf("%d %s %6.2f\n",student2.num,student2.name,student2.score);
else
{ printf("%d %s %6.2f\n",student1.num,student1.name,student1.score);
printf("%d %s %6.2f\n",student2.num,student2.name,student2.score);
}
return 0;
}*/
/**********************************************************************************
#include<string.h>
struct Person
{char name[20];
int count;
}leader[3]={"Li",0,"zhang",0,"Sun",0};//定义结构体数组并初始化
int main() //Li赋给leader[0].name 0赋给leader[0].count
{int i,j; //Zhang赋给leader[1].name 0赋给leader[1].count
char leader_name[20]; //Sun赋给leader[2].name 0赋给leader[2].count
for(i=1;i<=10;i++)
{scanf("%s",leader_name);//吧候选人名字输入数组中
for(j=0;j<3;j++)
if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;
} //每一次循环,(共循环三次)leader_name[]数组里面的所有名字(元素)与结构体数组leader[].name比较,相同count数值加一
printf("\nResult:\n");
for(i=0;i<3;i++)
printf("%5s:%d\n",leader[i].name,leader[i].count);
return 0;
}*********************************************************************************//*
struct Student
{int num;
char name[20];
float score;
};
int main()
{struct Student stu[5]={{10101,"zhang",78},{10103,"wang",98.5},{10106,"Li",86},{10108,"Ling",73.5},{10110,"Sun",100}};//定义结构体数组并初始化
//{10101,"zhang",78}分别赋值给stu[0].num name[20] score 其他同理
struct Student temp; // 定义结构体变量temp,用作交换时的临时变量
//常变量就是用const定义的变量,常变量的值是不能被改写的,只能使用不能改写
const int n=5;//定义常变量n
int i,j,k;
printf("The order is:\n");
///////////////////////////下面方法为选择排序法///////////////////
for(i=0;i<n-1;i++)//i<4
{k=i;
for(j=i+1;j<n;j++)
if(stu[j].score>stu[k].score)
k=j;
temp=stu[k];stu[k]=stu[i];stu[i]=temp;//stu[k]和stu[j]元素互换
}////////////////////////////////////////////////////////////////
for(i=0;i<n;i++)
printf("%6d %8s %6.2f\n",stu[i].num,stu[i].name,stu[i].score);
printf("\n");
return 0;
}*//******************************
例如:定义一个字符串char a[20],和一个字符串c[]="i am a teacher!";
把c复制到a中就可以这样用:strcpy(a,c);
这个函数包含在头文件 <string.h>中
.程序代码:#include<string.h>
#include<iostream.h>
void main()
{
char a[20],c[]="i am teacher!";
strcpy(a,c);
cout<<a<<endl;
}
***********************//*
#include<string.h>
struct Student
{long num;
char name[20];
char sex;
float score;
};
int main()
{
struct Student stu_1;//定义struct Student类型的变量stu_1
struct Student*p;//定义指向struct Student类型数据的指针变量p
p=&stu_1;//p指向stu_1
stu_1.num=10101;//对结构体变量的成员赋值
// strcpy 把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
strcpy(stu_1.name,"LiLin");
stu_1.sex='M';
stu_1.score=89.5;
printf("N0.:%ld\nname:%s\nsex:%c\nscore:%5.1f\n",stu_1.num,stu_1.name,stu_1.sex,stu_1.score);
printf("\nN0.:%ld\nname:%s\nsex:%c\nscore:%5.1f\n",(*p).num,(*p).name,(*p).sex,(*p).score);
return 0;
}*/
//c语言中允许把(*p).num用p->num代替
//“->”代表一个箭头,被称为指向运算符
/*******************************
如果p指向一个结构体变量stu,以下3中用法等价
a)stu.成员名
b)(*p).成员名
c)p->成员名
*//*
struct Student
{int num;
char name[20];
char sex;
int age;
};
struct Student stu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFang",'M',19},{10103,"WangMin",'F',20}};
int main()
{
struct Student*p;//定义指向该结构体的指针变量
printf("No.Name sex age\n");
for(p=stu;p<stu+3;p++)
printf("%5d %-20s %2c %4d\n",
p->num,p->name,p->sex,p->age);
return 0;
}*//*
#define N 3
struct Student
{int num;
char name[20];
float score[3];
float aver;
};
void input(struct Student stu[])
{int i;
printf("请输入各学生的信息:学号,姓名,三门课成绩:\n");
for(i=0;i<N;i++)
{
scanf("%d %s %f %f %f %f",&stu[i].num,&stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;
}
}
struct Student max(struct Student stu[])
{
int i,m=0;
for(i=0;i<N;i++)
if(stu[i].aver>stu[m].aver) m=i;
return stu[m];
}
void print(struct Student stud)
{
printf("\n成绩最高的学生是:\n");
printf("学号:%d\n姓名:%s\n三门课成绩:%5.1f,%5.1f,%5.1f\n平均成绩:%6.2f\n"
,stud.num,stud.name,stud.score[0],stud.score[1],stud.score[2],stud.aver);
}
int main()
{
struct Student stu[N],*p=stu;
input(p);
print(max(p));
return 0;
}*/