指针数组

 如果你想函数不带回值,或者带加一个值,直接传值就可以。如果你想函数带加几个值,可以用传地址的方法。[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));//间接访问也可以


  指针函数:是一个函数,函数的返回值为指针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值