指针inta,*p;1.a为变量,可以理解为对应内存的名称,通过这个名称访问对应内存2.p为地址,存放内存的地址,这个地址对应的内存只能存放整型值3.&a取变量的地址,如p=&a4.*P取地址p对应内存的整型值,如a=*p5.在没有给指针p赋值前,即p的地址不明确时,不要使用*p。指针与数组:1.数组inta[10],a就是数组的首地址2.数组可以用指针表示inta[10],*p;p=a;则数组的第i个元素,可以用*(p+i)的形式访问,等价于a[i]指针+整数的含义3.用a和p访问数组的区别允许p++,不允许a++,即p的值可改变,而数组a的值不能改变,当数组a为函数参数时,允许改变其值。数组必须事先确定大小,但指针可动态分配空间,动态分配内存见课件例:输入n,输入n个数,逆序后输出(事先不知道数的个数)#includestdio.h#includestdlib.h//包含了malloc和free函数的说明voidmain(){int*p,n;scanf(%d,&n);p=(int*)malloc(sizeof(int)*n);//分配n个整型单元,把首地址赋给pfor(inti=0;in;i++)scanf(%d,p+i);for(i=0;in/2;i++)//交换*(p+i)和*(p+n-i-1);{intc;c=*(p+i);*(p+i)=*(p+n-i-1);*(p+n-i-1)=c;}for(i=0;in;i++)printf(%d,*(p+i));free(p);//释放分配的空间}改进:把逆序输出的操作写成函数,并输出各数之和#includestdio.h#includestdlib.hvoidinversion(int*a,intn){for(inti=0;in/2;i++)//交换*(p+i)和*(p+n-i-1);{intc;c=*(a+i);*(a+i)=*(a+n-i-1);*(a+n-i-1)=c;}}intsumofarray(int*p,intn)//int*p可以改成intp[]{ints=0;for(inti=0;in;i++)s+=*(p+i);//以上语句可以语句for(inti=0,s=0;in;s+=*p++,i++);取代,但输出和之后p将不再指向数组的首地址,无循环体,加分号表示循环体为空语句,s+=*p++,i++为逗号表达式,值为最后一个表达式的值returns;}voidmain(){int*p,n;scanf(%d,&n);p=(int*)malloc(sizeof(int)*n);for(inti=0;in;i++)scanf(%d,p+i);inversion(p,n);for(i=0;in;i++)printf(%d,*(p+i));printf(\nsumis%d,sumofarray(p,n));free(p);}指针与字符串char*s=”helloworld”;合法chars[]=”helloworld”;合法chars[]s=”helloworld”;不合法,原因是s的值不能改变char*s;s=”helloworld”;允许,把存放”helloworld”的首地址赋给s举例:1)写一个函数,获取字符串的长度#includestdio.hintgetlen(char*s){for(intc=0;*s!=0;s++,c++);returnc;}voidmain(){char*a=abc;printf(%d,getlen(a));}2)实现strcpy函数功能copy_string#includestdio.h#includestdlib.h#includestring.hvoidcopy_string(char*from,char*to){for(;*from!='\0';from++,to++)*to=*from;*to='\0';}voidmain(){char*a;char*b;a=(char*)malloc(20);b=(char*)malloc(20);strcpy(a,Iamateacher.);strcpy(b,Youareastudent.);copy_string(a,b);printf(string_a=%s\n,a);printf(string_b=%s,b);free(a);free(b);}3)写一个函数计算一个字符串中出现不同英文字母的个数intGetLetterNum(char*s)//返回s中的出现的不同英文字母的个数{扫描s判断当前字符是否是英文字母判断是否已出现过加入已出现的字符的字符串中}intIsLetter(charc)//判断c是否是一个英文字母,是返回1,否则返回0{}intInString(char*s,charc)//判断字符c是否在s中,在返回1,不在返回0{}voidAppendALetter(char*s,chara)//在字符串最后加字符a{}用上面函数完成main程序结构指针例:员工信息包含工号和姓名,在全体员工范围内选举某个职位,每个员工以员工工号给出一个选举对象,要求统计每个员工的得票数,并输出得票最多的员工姓名。#includestdio.h#includestring.hstructstaff{charid[3];charname[30];intcount;};voidmain(){staffs[5]={{01,wang,0},{03,zhang,0},{04,zhou,0},{06,li,0},{07,jiang,0}};//结构数组定义及初始化,id最大长度为2charvote[5][3]={03,03,06,03,07};//以下程序把每个人s[i]的得票数填入countfor(inti=0;i5;i++){for(intj=0;j5;j++)if(strcmp(vote[i],s[j].id)==0)//不能写成if(vote[i]==s[j].id)s[j].count++;}//取s[i].count的最大者下标intmax,k;max=s[0].count;k=0;for(i=1;i5;i++){if(s[i].countmax){max=s[i].count;k=i;}}printf(%s得票最多为%d,s[k].name,s[k].count);}改进一:最高得票数相同的处理理想的方案是列出所有最高得票数的名字算法1:先得到最高得票数,然后第二次扫描,输出和最高得票数相同的员工名字算法2:思考是否可不做第二次扫描(到目前的相同最高保存在一个数组中,如最高刷新,清空)改进二:分别把统计的票数和获取最大值下标写成函数#includestdio.h#includestring.hstructstaff{charid[3];charname[30];intcount;};voidcount(staffp[],intpersonnum,charvote[][3],intvotenum){inti,j;for(i=0;ivotenum;i++)for(j=0;jpersonnum;j++){if(strcmp(p[j].id,vote[i])==0)p[j].count++;}}//获取最大s[i].count的下标intgetmax(staffs[],intnum){intmax,k;max=s[0].count;k=0;for(inti=1;i5;i++){if(s[i].countmax){max=s[i].count;k=i;}}returnk;}voidmain(){staffs[5]={{01,wang,0},{03,zhang,0},{04,zhou,0},{06,li,0},{07,jiang,0}};//结构数组定义及初始化,id最大长度为2charvote[5][3]={03,03,06,03,07};//以下程序把每个人s[i]的得票数填入countcount(s,5,vote,5);//取s[i].count的最大者下标intk=getmax(s,5);printf(%s得票最多为%d,s[k].name,s[k].count);}改写三:改写函数,结构数组用指针#includestdio.h#includestring.hstructstaff{charid[3];charname[30];intcount;};voidcount(staff*p,intpersonnum,charvote[][3],intvotenum){inti,j;for(i=0;ivotenum;i++)for(j=0;jpersonnum;j++){if(strcmp((p+j)-id,vote[i])==0)//访问结构指针指向的结构成员用-(p+j)-count++;}}intgetmax(staff*s,intnum){intmax,k;max=s-count;k=0;for(inti=1;i5;i++){if((s+i)-countmax){max=(s+i)-count;k=i;}}returnk;}voidmain(){staffs[5]={{01,wang,0},{03,zhang,0},{04,zhou,0},{06,li,0},{07,jiang,0}};//结构数组定义及初始化,id最大长度为2charvote[5][3]={03,03,06,03,07};//以下程序把每个人s[i]的得票数填入countcount(s,5,vote,5);//取s[i].count的最大者下标intk=getmax(s,5);printf(%s得票最多为%d,s[k].name,s[k].count);}要用上面的算法一实现相同最高的票全部输出姓名的功能,只需完成下列函数voidoutput(staff*s,intnum,intcnt)//输出的票数为cnt的所有s[i].name{}结构变量作为函数参数,值一样不能带出例:用函数设置上面结构变量的值#includestdio.h#includestring.hstructstaff{charid[3];charname[30];intcount;};voidassign(staffs,char*id,char*name,intcnt){strcpy(s.id,id);//不能写成s.id=idstrcpy(s.name,name);s.count=cnt;}voidmain(){staffst;strcpy(st.id,01);strcpy(st.name,wang);st.count=0;assign(st,02,zhou,3);printf(%s,%s,%d,st.id,st.name,st.count);}要达到这个目的,必须使用指针参数#includestdio.h#includestring.hstructstaff{charid[3];charname[30];intcount;};voidassign(staffs,char*id,char*name,intcnt){strcpy(s.id,id);//不能写成s.id=idstrcpy(s.name,name);s.count=cnt;}voidmain(){staffst;strcpy(st.id,01);strcpy(st.name,wang);st.count=0;assign(st,02,zhou,3);printf(%s,%s,%d,st.id,st.name,st.count);}返回指针类型的函数例:写一个函数,参数为字符串,剔除该字符串中非英文字母,剩下的英文字母构成的字符串按原来顺序输出。#includestdio.h#includestring.h#includestdlib.hchar*G