以下是引用片段:
#include
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'};//可以不填个
数,但必须初始化 "hello" 'h''e'
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];
s="zhou";//错误,不能对数组名赋值.数组名[下标];
char *s1;
s1="wang";//可以
<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换成他所指向的变量名
数组指针:一个指针指向了数组.//一维数组名
<2>指针数组:数组的每一个元素都是指针.[多个类型相
同的指针变量]
如: int *p[5];//p是一个二级指针,指向p[0],p有5个
元素,每个元素是一个指向整形的指针.
访问方法:
*(p[0])=4;**p=4;//二级指针访问,一级指针间接访问.
p+=1;指向p1
//*(p[1])=98; *(*(p+1))=77;
****:难点及考点:
1、float *array1 [4];array1是指针数组,是一个二
级指针,+1向下移动一个位置。
2、 float (*array2)[4]:array2是一个行指针,指向
某行,该行有4个元素。[与二维数组名等价的指针]
***array2+1指向下一行,移动4个元素的位置。
int a[5];//与a等价 int *pa=a;
int b[2][5];//与b等价 int (*pb)[5]=b;
int c[4][5];//pb=c;
三\函数指针:它是一个指针,指针指向一个函数.函数名就是一个指
针,指向为函数开辟空间的首地址。
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);//间接访问也可以
指针函数:是一个函数,函数的返回值为指针
int * max(int a,int b)
{
return (a>b?&a:&b);
}
int x=5,y=6;
*(max(x,y));
(*pmax)(x,y);
指针:存放地址,指向任何地方.
char name[10];//存放一个人的姓名 有20个人
char s[20][10];//用字符的一维数组存放字符串,二维
//用指向字符的指针存放字符串,有20个
char *array[20];字符串指针数组表示可以读入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
C、C++形参与实参传递参数的两种方法:
<1>传值与传地址:
函数调用:就是把实参赋值给形参,就是赋值。
<2>传值:函数会对形参和中间临时变量分配空间,但函
数调用结束时单元都收回.(有了克隆)
<3> 指针也是传值的,但是指针的间接访问达到传地址的效果,
传地址:没有分配空间(),用1引用作参数,2全局变量,3
数组作参数.
<4>函数名返回多个值的方法:定义多个全局变量,让函数去修改,
主函数调用这个函数.多个全局变量就带回了多个值.
#include<stdio.h>
int c1,c2;//定义全局变量 ,传地址
void max(int x,int y,int z)
{
if((x>y)&&(x>z))
{ c1=x;
if(y>z) c2=y;
else c2=z;
}
else if(y>z)
{c1=y;
if(x>z) c2=x;
else c2=z;
}
else {c1=z;if(x>y) c2=x;else c2=y; }
return ;
}
void swap2(int *x,int *y)
{
int temp=*x;
*x=*y;
*y=temp;
}
void swap1(int x,int y)//传值,函数对形参和中间的临时变量分配了空间
{ printf("x=%d y=%d\n",&x,&y);
int temp=x;
x=y;
y=temp;}
int main()
{
int j1=43,j2=98,j3=9;
max(j1,j2,j3);
printf("max1=%d max2= %d",c1,c2);
int a=65,b=7;
printf("x=%d y=%d\n",a,b);
swap2(&a,&b);
printf("x=%d y=%d\n",a,b);
getchar();
getchar();
}
数组作参数有三种,传地址。//修改有效,没有分配空间.
#include<stdio.h>
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 max(int *a,int size)
{
int t=0;
for(int i=0;i<size;i++)
if(a[i]>t)
t=a[i];
return t ;
}
int main()
{
int c[5];
read(c);
print(c,4);
printf("max=%d\n", max(c,5));
printf("%d\n " ,sum(c,5));
getchar();
getchar();
}