C指针二.docx

上传人:b****3 文档编号:11509036 上传时间:2023-06-01 格式:DOCX 页数:21 大小:144.11KB
下载 相关 举报
C指针二.docx_第1页
第1页 / 共21页
C指针二.docx_第2页
第2页 / 共21页
C指针二.docx_第3页
第3页 / 共21页
C指针二.docx_第4页
第4页 / 共21页
C指针二.docx_第5页
第5页 / 共21页
C指针二.docx_第6页
第6页 / 共21页
C指针二.docx_第7页
第7页 / 共21页
C指针二.docx_第8页
第8页 / 共21页
C指针二.docx_第9页
第9页 / 共21页
C指针二.docx_第10页
第10页 / 共21页
C指针二.docx_第11页
第11页 / 共21页
C指针二.docx_第12页
第12页 / 共21页
C指针二.docx_第13页
第13页 / 共21页
C指针二.docx_第14页
第14页 / 共21页
C指针二.docx_第15页
第15页 / 共21页
C指针二.docx_第16页
第16页 / 共21页
C指针二.docx_第17页
第17页 / 共21页
C指针二.docx_第18页
第18页 / 共21页
C指针二.docx_第19页
第19页 / 共21页
C指针二.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C指针二.docx

《C指针二.docx》由会员分享,可在线阅读,更多相关《C指针二.docx(21页珍藏版)》请在冰点文库上搜索。

C指针二.docx

C指针二

/*

*指针数组

*Lzy    2011-5-13

*/

#include

#include

 

int main()

{

    int X[3][3] = {{1,2,3},{4,5,6},{7,8,9}};/*定义一个二维数组并初始化*/

    //intX[3][3]={1,2,3,4,5,6,7,8,9};

    int *P[3] = {X[0],X[1],X[2]};               /*定义一个指针数组*/  

    int *ptr;                                  /*定义一个指针变量*/

    int **p;                                   /*定义一个二级指针变量*/

    int i;

   

    ptr = P[0];                       /*一级地址给指针变量ptr*/

    for(i = 0; i < 3; i++)

        printf("%d",*ptr++);        /*打印?

*/

 

    printf("\n----------\n");

 

    p = P;                         /*二级地址给二级指针变量p*/

    for(i = 0; i < 3; i++)

        printf("%d",**p++);     /*打印?

*/

 

    printf("\n");

}

 

 

/*

*指向二维数组元素的指针变量

*Lzy   2011-5-13

*/

#include

 

int main()

{

    int data[2][3] = {1,2,3,4,5,6};     /*二维数组初始化*/

    int *ptr;

    ptr = (int *)data;                   /*强制转换*/

 

    for(; ptr < data[0] +6 /*ptr

        printf("%d",*ptr); 

 

    printf("\n");

    return 0;

}

 

/*

*指向一维数组的指针变量

*Lzy   2011-5-13

*/

#include

 

int main()

{

    int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};/*数组初始化*/ int (*p)[4]=a,*q=a[0];

    int i;

 

    for(i=0;i<3;i++)

    { 

        if(i==0)

       (*p)[i+i/2]=*q+1;/*a[0][0]=1+1=2*/

    else

       p++,++q;/*p加一次表示地址下移4个元素,q表示下移一个元素*/

    }

    for(i=0;i<3;i++)

       printf("%d,",a[i][i]);

printf("%d,%d\n",*((int *)p),*q); /**p[0]与*((int *)p)一样*/

/*p[0]与p,*p一样表示地址*/

    return 0;

}

3个学生各学4门课,计算总平均分,并输出第n个学生成绩

/*

*二维数组的指针作函数参数

*Lzy   2011-5-13

*/

#include

 

int main()

{

    void average(float *p,int n);

    void search(float (*p)[4],int n);

    float score[3][4]={{65,67,79,60},{80,87,90,81},{90,99,100,98}};

   

    average(score[1],4);

    search(score,1);

 

    return 0;

}

 

void search(float (*p)[4],int n)

{

    int i;

   

    for(i = 0; i < 4; i++)

        printf("%5.2f\t",*(*(p+n)+i));

    printf("\n");

}

 

void average(float *p,int n)

{

    float sum = 0, aver;

    float *p_end = p + n;

 

    for(; p 

        sum += *p;

    aver = sum / n;

    printf("aver=%5.2f\n",aver);

}

解析:

一、你的floatscore数组定义的是:

一个3行、4列的二维浮点数组,数组的元素为浮点数。

如果你换个格式书写就清晰了!

floatscore[3][4]={{65,67,70,60,},{80,87,90,81,},{90,99,100,98}};

在调用的过程中,score就是这个数组的首地址,指向的是浮点数组{65,67,70,60,}。

score+1指向的是数组{80,87,90,81,}。

二、你的float*p定义的是:

一个指向浮点数的指针。

这个是一维的。

在调用的过程中,float指向的是xx。

一个浮点数字。

两个的定义不同,所以参数传递过程中会出错。

三、你的float(*p)[4]定义的是:

一个指向含有四个元素的浮点数组的指针。

在调用的过程中,float指向的是{xxx,xx,xx,xx,},由四个浮点数组成的数组。

这时两个定义相同,所以参数传递过程中没有错误。

四、有个建议,你的程序书写格式不清晰,不利于你纠错和修改,应该尽量的清晰、明确,不建议使用简化方式定义参数。

作为一个软件工作者,应该尽量使程序流畅、格式清晰、易读,这是一个软件工作者最基本的职业素养。

格式化后,程序如下,会清晰很多:

#include

voidmain()

{

voidsearch(float(*p)[4],intn);/*这里的float*p好像有问题*/

floatscore[3][4]={{65,67,70,60,},{80,87,90,81,},{90,99,100,98}};

search(score,2);

}

voidsearch(float(*p)[4],intn)/*这里的float*p好像有问题*/

{

inti;

printf("thescoreofNo.%dare:

\n",n);

for(i=0;i<4;i++)

{

printf("%5.2f",*(*(p+n)+i));

}

printf("\n");

}

既然score是一个二位数组,要想传参数,肯定要使用相应等级的指针(二位指针,数组指针,指针数组),总之不能使用一维数组啊float(*p)[4]和float**p是一个等级,所以可以的

首先要搞清楚*p和(*p)[4]分别是什么在定义的时候float*p定义了一个1维指针。

而score是一个二维数组。

会出现格式不对应的情况。

那为什么(*p)[4]为什么可以呢?

根据运算符优先级,括号里面优先级高,所以这是一个数组指针。

本质上是个指针,指针指向一个有4个元素的数组。

那怎样和score联系起来就显然了,一开始他先指向score的第一行,该行有4个元素。

然后可以指向下一行。

表示二维数组除了这个方式,还有*p[4](指针数组),**p(指针的指针),p[3][4](原型)。

在函数中的调用如下:

float (*p)[4] 声明了一个二维数组,其中第二维是固定的4,第一维是动态的。

float *p[4]这声明了一个二维数组,其中第一维是固定的4,第二维是动态的

(1)chara[m][n]--voidfunc(char(*p)[]);二维数组退化为数组的指针

(2)char*p[n]--voidfunc(char**p);这个是一个指针数组,我们只需要取地址即可;

(3)char(*p)[n]--voidfunc(char(*p)[]);这个本身就是一个数组指针,原封不动即可;

(4)char**p--voidfunc(char**p);对于指针的指针类型,同样原封不动。

/*

*指针与字符串

*Lzy   2011-5-13

*/

#include

 

int main()

{

    char str[] = "ILovethisgirl!

";

    char *ptr = str;

    printf("%s\n",ptr);

    printf("%s\n",ptr + 7);

    return 0;

}

 

/*

*用字符指针实现

*Lzy   2011-5-13

*/

#include

 

int main()

{  

    char *ptr = "ILovethisgirl!

";

    printf("%s\n",ptr);

    printf("%s\n",ptr + 7);

    return 0;

}

下面这个是个错误程序:

 

/*

*用字符指针实现(注意)

*Lzy   2011-5-13

*/

#include

 

int main()

{  

    char *ptr = "ILovethisgirl!

";

    *(ptr + 2) = 'l';    原因给常量赋值     /*错误右边指向的是常量*/

    printf("%s\n",ptr); 

    return 0;

}

 

 

用函数调用实现字符串复制

/*

*用字符数组作参数

*Lzy   2011-5-13

*/

#include

 

void kstrcpy(char from[], char to[])

{

    int i = 0;

    while(from[i])

    {

        to[i] = from[i];

        i++;

    }

    to[i] = '\0';

    printf("%s\n",to);

}

 

int main()

{  

    char str1[] = "ILove";

    char str2[] = "thisgirl!

";

 

    kstrcpy(str1,str2);

    printf("%s\n",str2);

}

 

/*

*用字符指针作参数

*Lzy   2011-5-13

*/

#include

 

void kstrcpy(char *from, char *to)

{  

    while(*from)

    {

        *to = *from;

        putchar(*to);

        from++;

        to++;

    }

    *to = '\0';

    printf("\n");

}

 

int main()

{  

    char str1[] = "ILove";

    char str2[] = "thisgirl!

";

 

    kstrcpy(str1,str2);

    printf("%s\n",str2);

}

 

/*

*函数指针调用函数

*Lzy   2011-5-13

*/

#include

#include

 

void fun(int);                    /* 函数声明 */

 

int main()

{

  int x = 6;

  void (*p)(int);             /* 定义函数指针变量 */

  p = &fun;                    /* 将fun函数的首地址赋给函数指针变量p*/

  fun(x);                     /* 直接调用fun函数 */

  (*p)(x);                     /* 通过函数指针变量p调用fun函数 */

  return 0;

}

 

void fun(int x)                   /* 函数定义 */

{

  printf("%d\n", x);

}

 

用函数指针变量作参数,求最大值、最小值和两数之和

/*

*函数指针作函数的参数

*Lzy   2011-5-13

*/

#include 

 

int add(int x, int y)

{

     return x+y;

}

int fun(int x, int y,int (*p)())

{

     printf("结果:

%d\n",(*p)(x,y));

}

int main()

{

     int x,y;

     printf("输入两个数:

");

     scanf("%d,%d",&x,&y);

     fun(x,y,add);

}

 

/*

*返回指针值的函数

*Lzy   2011-5-13

*/

#include 

 

char *kstrcpy(char from[], char to[])

{

    int i=0;

    while(from[i])

    {

        to[i]=from[i];

        i++;

    }

    to[i]= '\0';

    return to;

}

 

int main()

{  

    char str1[]= "ILove";

    char str2[]= "thisgirl!

";

   

    printf("%s\n",kstrcpy(str1,str2));

}

 

写一个函数,求两个int型变量中居于较大值的变量的地址

/*

*返回指针值的函数

*Lzy   2011-5-13

*/

#include 

 

int *fun(int *a, int *b)

{

     if(*a>*b)

          return a;

     else

          return b;

}

 

int main()

{

     int a=2,b=3;

 

     printf("%x\n",fun(&a,&b)); 

     return 0;

}

 

/*

*指针数组

*Lzy   2011-5-13

*/

#include 

 

int main()

     char *name[]={"Followme","BASIC","GreatWall","FORTRAN","Computer"};

     int i;

     for(i=0;i<5;i++)

          printf("%s\n",name[i]);

}

 

/*

*野指针

*Lzy   2011-5-13

*/

#include

 

int main(int argc, char *argv[])

    int *p;

    p = (int *)malloc(sizeof(int));     /*在堆中分配内存空间*/

    *p = 0;

    printf("%d\n",*p);

    free(p);                           /*释放空间*/

 

    *p = 5;                                /*(危险)野指针*/

    printf("%d\n",*p);

p=NULL;

}

 

其他:

1、.编写一函数,用于接收3-10之间的一个数,然后输出由星号组成的正方形。

例如,用户输入4,输出结果应为如下所示

****

*  *

*  *

****

/***************************************************

文件名:

说  明:

熟习函数的使用,完成打印正方形图形

 Autor:

Lzy

 Time :

2011-5-8

****************************************************/

#include

 

int init()

{

    int n = 0;

    while(n > 11 || n < 2)               /*判断输入是否合法,否则重新输入*/

    {

        printf("输入正方形的长度(大于2小于11):

");

        scanf("%d",&n);

    }

    return n;

}

 

void fprint(int N)

{

    int i, j;

 

    for(i = 0; i < N; i++)

        printf("*");

    printf("\n");

 

    for(i = 0; i < N-2; i++)

    {

        printf("*");

        j = N - 2;

        while(j--)

            printf("");

        printf("*\n");

    }

 

    for(i = 0; i < N; i++)

        printf("*");

    printf("\n");

}

 

int main()

{

    int side;

    side = init();

    fprint(side);

}

 

2、编写一个函数,输入字符串内,如果是两个以上连续空格,则用一个空格代替不明白

/******************************************

文件名:

说  明:

continue的使用

 Autor:

Lzy

 Time :

2011-5-9

*******************************************/

#include

 

int main()

{

    char c;

    char flag = 0;

 

    while((c = getchar()) !

= EOF)

    {

        if(flag == c)

            if( c == '')          

                continue;

        putchar(c);    

        flag = c;

    }

}

 

3、写一个函数找出一个整数数组中,第二大的数

#include 

#define N5

 

int main()

{

     int data[N]={8,2,6,4,5};

     int i,j;

     int temp;

    

     for(j=0;j

          for(i=j;i

          {

               if(data[j]>data[i+1])

               {

                     temp=data[j];

                     data[j]=data[i+1];

                     data[i+1]=temp;

               }

          }

    

          printf("%d",data[N-2]);

     return 0;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 公共行政管理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2