零基础学c语言c语言基础.docx
- 文档编号:29375297
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:25
- 大小:21.25KB
零基础学c语言c语言基础.docx
《零基础学c语言c语言基础.docx》由会员分享,可在线阅读,更多相关《零基础学c语言c语言基础.docx(25页珍藏版)》请在冰豆网上搜索。
零基础学c语言c语言基础
【零基础学c语言】c语言基础
c语言基础
在一维数组中,存在p+i=a+i,*(p+i)=*(a+i)=*(&a[i])=a[i]p1+n=a+n=&a[n];代表第n行的首地址。
二维数组:
*(p1+n)+0=*(a+n)+0=*(&a[n])代表n行0列地址。
(*p)[4]指向的是含有4个整型元素的一维数组,默认p=a,指向0行首地址;
p指向的二维的0行,加1是指向下一行,不指向每一行元素,要想求行列交点值那就取摸*(*(p+i)+j)、、p+i表示行号,从而转到对应的行列数
例如:
(*p)[4]用法,输出任意一行一列的值
#include
voidmain()
{inta[3][3]={1,2,3,4,5,6,7,8,9},(*p)[3],i,j;
p=&a[0];
scanf("%d%d",&i,&j);
printf("a[%d,%d]=%d\n",i,j,*(*(p+i)+j));
}
#include
voidmain()
{inta[3][3]={1,2,3,4,5,6,7,8,9},*p,i;
p=a[0];
for(i=0;i{printf("%d\t",*(p+i));}//a[0]+1到a[0]+9可以输出所有的值
printf("\n");
}
最多在一维数组中用到:
*p1=*p2是把p1指向的变量的值改变,但p1所指向的变量不变,
p1=p2,则是p1指向变量改变了,即p1不再指向原变量的地址,改为指向p2所指向的地址.
题目:
把数组a复制到b数组上
法1
#include//
voidmain()
{int*p,*p1,a[]={1,2,3,4,5},i,b[5];
p=a;
p1=b;
for(i=0;i{*p1=*p;}//赋值给他,但他们所指的变量都不变
for(i=0;i{printf("%d\t",b[i]);}
printf("\n");
printf("%d\t",b[4]);//这样可以的,因为它记录了这个数组的地址以及对应素质printf("\n");
}
法2不能用,
#include
voidmain()
{int*p,*p1,a[]={1,2,3,4,5},i,b[5];
p=a;
p1=b;
for(i=0;i{p1=p;//导致指向的变量变了
printf("%d\t",*p1);
}
printf("\n");
}
以上几题就用到第一段的方法
案例1数组名做实形参数
法1:
#include//1230456,前后调换,
voids(inta[],intn)
{inti,t,k=(n-1)/2;
for(i=0;i{t=a[i];
a[i]=a[n-1-i];//以下三个数组交换值固定格式
a[n-1-i]=t;
}
}
main()
{inti;
inta[]={1,2,3,0,4,5,6};
for(i=0;i{printf("%d",a[i]);
}
printf("\n");
s(a,7);
for(i=0;i{printf("%d",a[i]);}
printf("\n");
}
法2:
#include//1230567,前后调换,用的指针法
voids(int*p,intn){inti,t,k=(n-1)/2;//
for(i=0;i{t=*(p+i);
*(p+i)=*(p+n-1-i);
*(p+n-1-i)=t;
}
}
main()
{inti;
inta[]={1,2,3,0,5,6,7};
for(i=0;i{printf("%d",a[i]);
}
printf("\n");
s(a,7);
for(i=0;i{printf("%d",a[i]);}
printf("\n");
}
#include//一般方法,1230456从大到小输出,数组名做形参数voids(inta[],intn)
{inti,j,t;
for(j=0;j{for(i=0;i{if(a[i]{t=a[i];
a[i]=a[i+1];
a[i+1]=t;}
}
}
}
main()
{inta[7]={1,2,3,0,4,5,6},i;
for(i=0;i{printf("%d",a[i]);}
printf("\n");
s(a,7);
for(i=0;i{printf("%d",a[i]);
}
printf("\n");
}
#include//一般方法,1230456从大到小输出,数组名做形参数voids(inta[],intn)
{inti,j,t;
for(j=0;j{for(i=0;i{if(a[i]{t=a[i];
a[i]=a[i+1];
a[i+1]=t;}
}
}}
main()
{inta[10],i;
printf("pleaseinput10numbers:
");
for(i=0;i{scanf("%d",&a[i]);}
s(a,10);
for(i=0;i
{printf("%d",a[i]);
}
printf("\n");
}
下页c语言基础
案例2数组名作实参,指针做形参数,#include//1230456从大到小输出,
voids(int*p,intn)//调用函数后,就相当于定义指针变量一样,p=a,当做自己数组处理,在之前里面不能出现其他的数组
{inti,j,t;
for(j=0;j{for(i=0;i{if(*(p+i){t=*(p+i);
*(p+i)=*(p+i+1);//这题你应该用指针的。
*(p+i+1)=t;}}
}
}
main()
{inta[10],i;
printf("pleaseinput10numbers:
");
for(i=0;i{scanf("%d",&a[i]);}
s(a,10);
for(i=0;i{printf("%d",a[i]);
}
printf("\n");
}
案例3实参和形参都是指针变量
就把实参指针变量指向的数组都付给形参指针变量,当做自己的数组
案例4实参为指针变量,形参为数组名
#include//3行4列输出,二维数组指针
voidmain()
{inta[3][4]={1,2,2,2,3,4,4,5,5,6,9,0},i,*p;
for(p=a[0],i=1;p{
printf("%d\t",*p);
if(i%4==0)
{printf("\n");}
}
}
上面2-底一样的题目
#include//输入行列号,输出任意一行一列元素,二维数组指针
voidmain()
{inta[3][4]={1,2,2,2,3,4,4,5,5,6,9,0},i,j;
printf("pleaseinputiandj:
");
scanf("%d,%d",&i,&j);
//不需要的p=a[0];//&a[0][0]
printf("a[%d,%d]=%d\n",i,j,*(a[i]+j));
}
这两个最特殊:
p指向由m个数组元素构成的一维数组
#include//3行4列输出,二维数组指针
voidmain()
{inta[3][4]={1,2,2,2,3,4,4,5,5,6,9,0},i,j;
int(*p)[4];//虽然是二维数组,但是他这意思是p指向含有4个整形元素的一维数组,p=a;//意思是指向0行a[0],p+1为a[1]行
printf("pleaseinputiandj:
");
scanf("%d,%d",&i,&j);
printf("a[%d,%d]=%d\n",i,j,*(*(p+i)+j));//这是二维数组取地址方式
}
#include//3行4列输出,二维数组指针
voidmain()
{inta[3]={1,2,2},i,j;
int(*p)[3];
//虽然是二维数组,但是他这意思是p指向含有4个整形元素的一维数组,//p=a;//意思是指向0行a[0],p+1为a[1]行
//printf("pleaseinputiandj:
");
//scanf("%d,%d",&i,&j);
//printf("a[%d,%d]=%d\n",i,j,*(*(p+i)+j));//这是二维数组取地址方式p=&a;
printf("%d\n",(*p)[2]);
}
题目为:
有一个班,3个学生,都学4门学科,求所有的平均成绩,可以查出n个学生的成绩,查找有一门以上课程不及格的学生,输出他们的全部课程的成绩.
把*a数组元素首地址赋给指针p,p就代表指向主调函数,
#include,
voidf(int*p,intn)
{int*p1,s=0,av;
p1=p+n;
for(;p{s=s+(*p);
}
()av=s/n;
printf("%d\n",av);//av=3
}
main()
{inta[3][4]={2,4,2,2,2,6,2,8,2,4,4,8};
f(*a,12);//a是首行的地址&a[o],p=a;*a指的是数组首元素地址a[0]+0,或者&a[0][0],p=a[0],把*a数组元素首地址赋给指针p
}
把a数组赋给指针p,p就代表指向主调函数,
voidf2(int(*p2)[4],intn)//p指向的是含有4位整形数组的一维数组,对二维讲,她也是从一维看,由上而下一行看,对一维来说p=&a,取摸(*p)[4]
{inti,j;
for(n=0;n{for(i=0;i{if(*(*(p2+n)+i){for(j=0;j{printf("%d\t",*(*(p2+n)+j));
}//这三个黄色是固定搭配,死记
printf("\n");
break;
}
}
}
}
main()
{inta[3][4]={4,4,4,4,2,6,2,8,2,4,4,8};
f(*a,12);//*a指的是数组首元素地址a[0]+0,或者&a[0][0],p=a[0],把*a数组元素首地址赋给指针p
f1(a,2);
printf("\n\n");
f2(a,3);
printf("\n");
}
上页下页c语言基础
用二维数组求平均数
voidmain()//
{inta[3][4]={1,2,2,2,3,4,4,5,5,6,9,0},*p,s=0,av;
for(p=a[0];pav=s/12;
printf("%d\n",av);
}
对于一位数组:
字符数组
指针和字符数组的相互应用:
#include
main()
{char*s={"abc"};//定义的字符指针s默认指向字符串a首地址
do
{printf("%d\t",*s%10);//*s取摸后再取余
++s;//s指向下一个元素地址
}while(*s);
printf("\n");
}
题目:
1,定义一个字符数组,存放“ilovechina”,输出该字符串和第8个字符数组include
voidmain(){charstring[]={"ilovechina"};//或者string[]={'i','l','o','v','e','
','c','h','i','n','a'};等价printf("%s\n",string);//为%d求得就是0元素的地址,%s输出ilovechina
printf("%c",string[7]);//为%d求得就是7元素的地址asciic=99,%c输出c,%s就有问题printf("\n");
}
2,通过字符指针变量输出一个字符串:
法1:
#include
voidmain()
{chars[]={"ilovechina"};
printf("%c",s[1]);//为%d求得就是0元素的地址,%s输出ilovechina
printf("\n");
}
法2:
#include
voidmain()
{char*p={"ilovechina"};//固定格式,定义字符指针变量s,并对s初始化
printf("%c\n",p[0]);//结果是i
p="212";//也可以对s重新赋值printf("%c\n",a、[1]);
printf("%s\n",p);
//p指向的是字符串常量的第一个字符,会自动加1指向下一个字符地址}//输出的结果是212,s指向2,输出自动加1
或者
#include
voidmain()
{char*s;//固定格式,定义字符指针变量s,并对s初始化
s=={"ilovechina"};把字符数组首元素i地址赋给了s
printf("%s\n",s);//结果是ilovechina
}
sizeof与strien的用法:
第一:
对于字符指针数组char*s="0123456789";
sizeof(s)结果4,因为s是指向字符串常量的字符指针,sizeof获得的是一个指针的之所占的空间,应该是
长整型的,所以是4
sizeof(*s)结果1,因为*s是第一个字符其实就是获得了字符串的第一位'0'
所占的内存空间,是char类型的,占了1位strlen(s)=10如果要获得这个字符串的长度,则一定要使用strlen(是获得有效字符长度,无\0)
例如:
#include
#include
main()
{charstr[][20]={"one*world","one*dream!
"},*p=str[1];
printf("%d,",strlen(p));
printf("%s\n",p);//p指向的是字符串常量的第一个字符,会自动加1指向下一个字符地址}////或者str也可以输出字符串
字符串比较函数:
一般形式:
strcmp(字符串1,字符串2)
说明:
当s1当s1=s2时,返回值=0
当s1>s2时,返回值>0
即:
两个字符串自左向右逐个字符相比(按aScii值大小相比较),直到出现不同的字符或遇'\0'为止。
如:
"a""a">"a"
"computer">"compare"
特别注意:
strcmp(constchar*s1,constchar*s2)这里面只能比较字符串,不能比较数字等其他形式的参数。
charname[20];
scanf("%s",name);
//这个可以输入字符串
scanf("%s",&name);错误的
字符串连接函数:
#include
#include
voidmain()
{inti;
chara[]="123",a1[]="asd";
printf("%s",strcat(a,a1));//a与a1两个字符串连接在一起123asd,字符串连接函数printf("\n");//strcpy(a,a1));//把a1复制覆盖到a1,asd字符串复制函数
}
#include
voidmain()
{chara[5];
printf("请输入字符数组a:
");//在输入时,辨别谁是谁输入的,以空格为界限分开scanf("%s",a);//必须是数组名,
printf("%s",a);
printf("\n");
}
题目:
将数组字符串a复制到数组b上,并输出数组b
法1:
#include
voidmain()
{chara[]={"im"},b[5];//b[]在定义时候一定要知道大小inti;
for(i=0;*(a+i)!
='\0';i++)//不定义p也能用指针,用*(a+i)代替,遇到‘\0’就跳出结束输出,表示已处理完
{*(b+i)=*(a+i);}*(b+i)='\0';//一定把\0复制过去给他
printf("stringais:
%s\n",a);//下面三句也可以用printf("stringbis:
%s\n",b);代替
printf("stringbis:
");//
for(i=0;b[i]!
='\0';i++)
{printf("%c",b[i]);}
printf("\n");
}
法2:
#include//
voidmain()
{char*p,*p1,a[]={"ilove"},b[7];
inti;
p=a;
p1=b;
for(i=0;i{*p1=*p;}//赋值给他,但他们所指的变量都不变
for(i=0;i{printf("%c",b[i]);}
printf("\n");
}
法3:
#include
voidmain()
{chara[]={"im"},b[5],*p,*p1;//b[]在定义时候一定要知道大小inti;
p=a;
p1=b;//可省略
for(p=a,p1=b;*p!
='\0';p++,p1++)//不定义p也能用指针,用*(a+i)代替,遇到'\0'就跳出结束输出
{*p1=*p;}
*p1='\0';
printf("stringais:
%s\n",a);
()printf("stringbis:
");
//下面三句也可以用printf("stringbis:
%s\n",b);代替
for(i=0;b[i]!
='\0';i++)
{printf("%c",b[i]);}
printf("\n");
}
题目:
用函数调用实现字符串的复制
法1:
#include
voidcopy(chara[],intn)//数组名
{inti=0;
charb[20],*p,*p1;//b数组长度一定要大于等于调用函数的数组长度
p=a;
p1=b;
for(i=0;i{*p1=*p;}
for(i=0;i{printf("%c",b[i]);}
}
main()
{chara[]={"ilovechina"};
charc[]={"youlovechina"};
copy(c,15);//数组名
printf("\n");
copy(a,13);
printf("\n");
}
上页下页c语言基础
#include
voidcopy(charc[],chard[])//定义的数组,传递数组名或者数组名也可以用声明的指针代替{inti=0;
for(i=0;*(c+i)!
='\0';i++)//字符复制给另一方那就用左面的方法
{*(d+i)=*(c+i);}
*(d+i)='\0';
printf("%s\n",c);
printf("%s\n",d);
}
main()
{chara[]={"im"},b[]="in",*p,*p1;//b[]在定义时候一定要知道大小
inti;
p=a;
p1=b;
printf("%s\n",a);
printf("%s\n",b);
printf("覆盖b数组后:
\n");
copy(p,p1);//或者copy(a,b);传递数组名和指针都可以
printf("\n");
}
法3:
#include
voidcopy(charc[],chard[])
{inti=0;
while(c[i]!
='\0')
{d[i]=c[i];
i++;}
printf("%s\n",c);
printf("%s\n",d);
}
main()
{chara[]={"im"},b[]="in",*p,*p1;//b[]在定义时候一定要知道大小
inti;
p=a;
p1=b;
printf("%s\n",a);
printf("%s\n",b);
printf("覆盖b数组后:
\n");
copy(p,p1);
printf("\n");
}
#include
voidc(char*p1,char*p2)
{inti;
for(i=0;*(p1+i)!
='\0';i++)
{*(p2+i)=*(p1+i);}
*(p2+i)='\0';
}
main()
{char*a={"wiqo"};//定义声明字符指针变量,a指向字符串常量的第一个字符w
char*p,b[]={"1227"};
p=b;
c(a,p);
printf("%s\n",a);
printf("%s\n",b);
}
#include
voidcopy(char*p,char*p1)
{inti=0;
for(i=0;*(p+i)!
='\0';i++,p++,p1++)//不定义p也能用指针,用*(a+i)代替,遇到'\0'就跳出结束输出
{*p1=*p;}
*p1='\0';
}
main()
{chara[]={"im"},b[]="in",*p,*p1;//b[]在定义时候一定要知道大小
p=a;
p1=b;
printf("%s\n",a);
printf("%s\n",b);
printf("覆盖b数组后:
\n");
copy(p,p1);
//printf("%s\n",a);
printf("%s\n",b);
}
指向函数的指针变量
题目:
输出a,b两个最大值
#include
intmax(inta,intb)
{intz;
if(a>b)
z=a;
else
z=b;
return(z);
}main()
{int(*p)(int,int);//这些都是必须要有的inta=2,b=4,c;
p=max;
c=(*p)(2,4);
printf("%d\n",c);
}
题目:
输入1,2,3选择调用哪个程序#include
intfun(intx,inty,int(*p)(int,int))//学会用fun函数的功能
{intr;
r=(*p)(x,y);
return(r);
}
intmax(inta,intb)
{intz;
if(a>b)z=a;
elsez=b;
return(z);
}
intmin(inta,intb)
{intz;
if(a>b)z=b;
elsez=a;
return(z);
}
intsum(inta,intb)
{intz;
z=a+b;
return(z);
}
main()
{inta=2,b=4,c,n;
printf("用户输入选择是:
");
scanf("%d\n",&n);
if(n==1)
c=fun(2,4,sum);
if(n==2)
c=fun(2,4,max);//只要写函数名就可以了
if(n==3)
c=fun(2,4,min);
printf("%d\n",c);
}
被调用的指针函数返回指针值如下:
题目:
有3个同学,每一个学生有3门成绩,任意输入一个学生序号(序号从0开始),输出该生的所有成绩
#include//指针函数定义套用格式
int*c(int(*p1)[3],intn)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基础 语言