函数指针指针数组

来源:互联网 发布:java遍历map集合 编辑:程序博客网 时间:2024/04/17 02:18

2009-03-21 03:24:00|  分类: 汇编语言|字号 订阅

以下是引用片段:
  #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();
}

 

原创粉丝点击