如果你想函数不带回值,或者带加一个值,直接传值就可以。如果你想函数带加几个值,可以用传地址的方法。[1全局变量2指针的间接访问3数组]
void 无返回值的函数,只能作为语句调用,不能作为表达式调用。
数组用参数:传地址,函数修改有效。
三种:一个参数[死的],二个参数(int a[],int *a)
void read(int a[5])//参数一、一个参数(是死的)
{
for(int i=0;i<5;i++)
scanf("%d",&a[i]);
}
void print(int *a, int size )//数组作参数的第二种形式,第一个参数用指针
{
for(int i=0;i<size;i++)
printf("%d ",a[i]);
}
int sum(int a[],int size)//形式三,活的。一维的个数可以不限定,但第二个参数起限定的作用
{
int s=0;
for(int i=0;i<size;i++)
s=s+a[i];
return s;
}
int main()
{
int c[5];
read(c); //调用数组
print(c,4);
printf("%d", sum(c,5));
}
完整程序:
void read(int a[5])//数组作参数的第一种形式,一个参数(是死的)
{
for(int i=0;i<5;i++)
scanf("%d",&a[i]);//数组名[下标]
}
void print(int a[],int size)//组作参数的第二种形式,一维的个数可以不限定,但第二个参数起限定的作用
{
for(int i=0;i<size;i++)
printf("%d ",*(a+i));
//数组名的指针的访问方式
}
void max(int *a,int size)//数组作参数的第三种形式,第一个参数用指针。
{
int temp ;
for(int i=0;i<size;i++)
{
if(*(a+i)>temp)
temp=*(a+i);//数组名的指针的访问方式
else continue;
}
return temp;
}
int sum(int *a,int size)//数组作参数的第三种形式,第一个参数用指针
{
int s=0;
for(int i=0; i<size; i++)
s = s+*(a+i);//或者 s=s+a[i];
return s;
}
void sort1(int *a, int size)
{
for(int i=0;i<size-1;i++)
{
for(int j=i+1;j<size;j++)
{
if(a[i]>a[j])//或者 if(*(a+i)>*(a+j))
{
int temp=a[i];
a[i]=a[j];
a[j]=temp;// 交换两个数
}
}
}
}
void sort2(int *a,int size)//冒泡排序
{
for(int i=0;i<size-1;i++)
{
for(int j=0;j<size-i-1;j++)
{
if(a[j]>a[j+1])//或者 if(*(a+j)>*(a+1+j))
{
int temp=a[j] ;
a[j]=a[j+1] ;
a[j+1]=temp;// 交换两个数
}
}
}
}
void main()//主程序
{
int s[5];
read(s);//调用数组作参数的第一种形式
printf("%d n",max(s,5));//调用数组作参数的第二种形式
printf("%d n",max(s,4));//调用数组作参数的第二种形式
printf("%d n",sum(s,4));//调用数组作参数的第二种形式
sort1(s,5);//调用数组作参数的第三种形式
print(s,5);//调用打印
sort2(s,5);//调用数组作参数的第三种形式
print(s,5);//调用打印
getchar();
}
以下是引用片段:
main()
{
char *p="abcde/0fghjik/0 ";
printf("%d/n ",strlen(p));
}
程序运行后的输出结果是
A)12
B)15
C)6
D)5
答案为:D (2006年9月全国C语言考试题)
字符串:以""括起来的字母序列,以' 0'结束,在C语言中放在字符一维数组中存储。
如:char s[20]="你这个学生是个大坏蛋!";//不要加' 0';系统自动添加
scanf("%s",s);//不要加' 0';系统自动添加
char a[]={'h','e','l','l','o',' 0'};//可以不填个数,但必须初始化
char b[5];
for(int i=0;i<5;i++)
scanf("%c",&b[i]) ;
b[i]=' 0';//要加' 0'
如果一个一个赋值必须给' 0';如果一次性赋值可以不给,系统自动添加' 0'
字符指针:char *name="张三";
字符指针与字符数组两者区别:
<1>字符数组已经分配了固定大小的存储空间,每个里面放一个字符,数组名放第一个元素的地址。
字符指针中没有分配固定大小 的空间,只是把"张三",
这个串的首地址放在name中。
<2>字符数组名是常量,不能修改如:char s[20] ="hello";s=s+3;//错误
字符指针可以修改,指向其它的位置,因为他没有固定的空间;
char *s="llo";s=s+2;//正确
<3>初始化有区别: char s[20]="zhang";
<4>字符串用库函数,尽量分配固定大小的存储空间,如果是字符指针应先申请,再赋值.
char name[]="你好";char name2[8];
scanf("%s",name2);
strcpy(name,name2); //复制两个串
char *s="你好";//比较危险,不推荐使用
可以用下面替代:
char name3[20]="你好";
scanf("%s",name3);
s=new char [strlen(name3)+1];//先申请空间C语言改
成 (char *)malloc(strlen(name3)+1)
strcpy(s,name);//再赋值
//#include<malloc.h>
//#include<string.h>
//char *s=new char [strlen("hello")+1];
//char *s=(char *) malloc(strlen("hello")+1);
//strcpy(s,"hello");
间接访问:*指针名=值。作用:用指针来间接访问指
针所指向的变量。
int x=7,*px=&x;
*px=9;//*px换成他所指向的变量名
指针的第二大作用:动态申请空间.
<1>申请空间:堆分配
#include<malloc.h>
类型 *指针=( 类型* )malloc(字节数);
如: int a=5;
int * pa=&a ;//没有动态申请空间
int *pb=(int * ) malloc(sizeof(int));
*pb=(*pb)*(*pb);
*pb=78;
float *px=(float *)malloc(sizeof(float));
calloc(unsigned n,unsigned size);//分配n个长
度为size的空间。
int *pk= (int *) calloc(4,sizeof(int));
for(int i=0;i<n;i++)
*(pk+i)=i*10;
pk[2]=*(pk+2)=5;
float *pr=(float *)malloc(5*sizeof(float));
//malloc申请数组 pr[i]=*(pr+i);
总结:指针不仅可以申请一个空间,还可以申请一片
连续的空间和数组一样。
<2>释放空间:**动态申请,必须动态释放。
由malloc与calloc申请的空间,必须用
free(指针名);
int m=8,*p=&m;
free(p);//系统出现异常错误
***:指针赋值两种:一种是指向某个固定的变量。二种
是先申请空间,再赋值[间接访问]。,否则指针不安全.
整数3个比较大小 int *p=malloc(3*sizeof(int));
for(;;)scanf(,p[i]);
if((*p>*(p+1))&&((*p>*(p+2)))
printf("",*p);
else if(*(p+1)>*(p+2))
printf("",*(p+1));
else printf("",*(p+2));
char *s1="";,*s2=..,*s3="";
// scanf("%s %s %s",s1,s2,s3);
if(strcmp(s1,s2)&&(strcmp(s1,s3))
printf("",s1);
else if(strcmpy(s2,s3);
printf("",s2);
else printf(" ",s3);
难点:指向指针的指针:二级指针,走2步可以到变量
,注意赋值。
int a=5; int *pa=a; int **paa=&pa;//取一级指针地
址 **paa=65;// 间接访问走2步
难点****:
指针数组:多个类型相同的指针变量。
<1>例如:int *p1[4];//p1是一个长度为4的数组
,数组的每一个元素是指向整形的指针。[如图所示]
p1:是一个 2 级指针。
<2>怎样访问***: *(p1[0])=7;
for(;;) *(p1[i])=*(*(p1+i))
声明30个float 类型的指针变量:
float *p[30];
char *array[10];字符串指针数组表示可以读入10
个人的姓名。 如张三、李四、王五/..
array[0]="张三"; array[1]="李四";//正确
char name[5][10];//也可以用二维字符数组
name[0]="张三";//错误
int argv,char *argc[]:
copy.exe 1.txt 2.txt
argv:系统自动统计 =3
argc[0]--编译路径
argc[1]--1.txt
argc[2]---2.txt
数组指针:一维数组名
int *p1[4];p1是二级指针,+1移动一个
与 int (*p2)[4];p2是一个行指针,每行有4个元素.与二维数组等价,+1移动4个到 下一行
int a[3][4];声明与a等价的指针
int (*p)[4]=a;//正确 a[i][j]=p[i][j]
int b[4];int *pb=b;//等价形式
三/函数指针:它是一个指针,指针指向一个函数
int max(int x,int y){return x>y?x:y;}
函数一旦调用,系统就会为这个函数分配存储空间,代函数的形参和临时变量使用[传值],当函数调用结束时这些空间全部收回.函数名实际上是系统分配空间的首地址,是一个一级指针.
int (*pmax)(int ,int )=&max;//指向mAX
int (*pmax)(int x,int y)=max;//也可以
因为max本身就是一个一级指针
调用方法: max(a,b);可以用下面的二种方式调用:
pmax(a,b)可以;
*(pmax(a,b));//间接访问也可以
指针函数:是一个函数,函数的返回值为指针