C语言指针2

作者: 潇湘候晨雪 | 来源:发表于2017-08-28 17:38 被阅读10次

    char * string =“I  LOVE china”;

    在C 语言中 只有字符变量,没有字符串变量。

    char *string; // 定义一个 char *  型变量。(字符指针变量);

    string =“i love china”;

    注:string 被定义为一个指针变量,基类型为字符型。只能指向一个字符型数据,而不能指向多个字符数据,只接受首地址。

    //=====================

    # include

    int main( )

    {

    char a[ ] =“I am a man”,b[20];

    int i;

    for(i = 0;*(a+i) !=‘\0’;i++)

    {

    *(b + i) = *(a + i);

    }

    *(b + i) =‘\0’;

    printf(“string a is :%s\n”,a);

    printf(“string b is:”);

    for(i = 0;b[i] !=‘\0’;i ++)

    printf(“%c”,b[i]);

    printf(“\n”);

    return 0;

    }

    // ===== 指针处理===

    char a []=“I am a man”,b[20],*p1,*p2;

    p1 = a;p2 = b;

    for(;p1 !=‘\0’;p1++,p2++)

    *p2 = *p1;//将p1所指向的元素的值赋给p2 所指向的元素;

    *p2 =‘\0’;

    printf(“string a is :%s\n”,a);

    printf(“string b is :%s\n”,b);

    //============

    2.字符指针 作为 函数参数

    如果想把字符串 从一个 函数 传递到 另一个函数 ,可以用地址传递的方法,即用字符数组名作参数,也可用字符指针变量 作 参数。在被调用的函数中 可以 改变 字符串 的内容 ,在主调函数中可以引用改变后  字符串。

    、用函数实现字符串的复制

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

    {

    int i;

    while(from[i] !=‘\0')

    {

    to[i] = from[i];i++;

    }

    to[i] =‘\0’;

    }

    void copy_string(char *from,char *to)

    {

    for(;*from !=‘\0’,from++,to++)

    {

    *to = *from;

    }

    *to =‘\0’;

    }

    //======

    、指针变量的值可以改变,而数组名代表一个固定的值(数组元素的地址),不能改变。

    、字符数组中各元素的值可以改变,但是字符指针变量指向的字符串常量中内容是不能被取代的。

    char a[] =“house”;

    char *b =“house”;

    a[2] =‘r’;b[2] =‘r’;(非法的)

    、引用数组元素。对字符数组可以用下标法一个数组元素,如a[5]; 也可以用地址法  *(a + 5);如果定义了字符指针变量  p,并使它指向字符数组首元素。就可以用指针变量带下标的形式引用字符数组元素(P[5]),同样,可以使用地址符号 *( p + 5);

    、用指针变量指向一个格式字符串,可以用它代替格式字符。

    char *format;

    format =“a = %d,b=%f\n"

    但是使用 字符数组时,只能采用 在定义数组时初始化,或者逐个对元素赋值,而不能对数组名 整体赋值。

    2、指向函数的指针

    在程序中定义了一个函数,在编译时,编译系统会自动为代码分配一段存储空间,这段存储空间的起始地址(又称入口地址),称为正饿函数的指针。

    如何定义: 类型名 (*指针变量名)(函数参数表列)

    类型名:函数返回值类的型

    函数参数列表:形参的类型

    int max(int ,int );

    int min(int ,int);

    int(*p)(int x,in y);

    int a,b,c,n;

    printf(“enter  a  and b:")

    scanf(“%d,%d”,&a,&b);

    printf(“choose 1 or 2:")

    scanf(“%d”,&n);

    if(n == 1) p = max;

    else if (n ==2) p = min;

    c = (*p)(a,b);

    printf(“a = %d,b= %d”,a,b);

    if ( n == 1) printf(“max = %d”,c);

    else printf(“min = %d”,c);

    return 0;

    int max(int x,int y);

    int min(int x,int y);

    一个指向函数的指针变量  可以指向不同函数

    3.用指向函数的指针   作为函数参数

    指向函数的指针变量 的 一个 重要用途 是 把 函数的地址 作为参数传递 到其他 函数

    int add(int x,int y)

    {

    int z;

    z = x + y;

    return z;

    }

    int min (int x,int y)

    {

    int z ;

    z = (x > y) ? y:x;

    return z;

    }

    int max(int x,int y)

    {

    int z;

    z = (x > y) ? x : y;

    return z;

    }

    int fun(int x,int y,int (*p) (int ,int)) // 声明形参 是 指向 函数的指针

    {

    int result;

    result = (*p)(x,y);

    printf(“%d\n”,result);

    }

    int main( )

    {

    int a =34,b = -21,n;

    printf(“choose the number 1,2 or 3:”);

    scanf(“%d”,&n);

    if (n == 1)   fun(a,b,max); // max 作为实参 将其入口地址 传送给 fun中的形参 P;

    if (n == 2)   fun(a,b,min);

    if(n == 3)    fun(a,b,add);

    return 0;

    }

    //===========================================

    3、返回指针值的函数

    一个函数 可以返回 一个整型值、字符值、实型值等 ~,也可返回指针型的数据。

    int * a(int x,iint y); a 是函数名,调用它以后能得到 一个 int * 型(指向整形数据)的指针,即整型数据的地址。()优先级 高于 *; a 先与()结合,显然是函数形式。函数前面有* 。表示此函数是函数型指针(函数值时地址),最前面的int 表示 返回的 指针 指向整型变量。

    类型名 * 函数名(参数表列);

    有 a 个学生,每个学生有  b 们成绩。要求在学生输入学生 序号以后,能输出 该生的全部成绩。

    // 数组 存放 成绩;查询学生成绩的函数 ,它是一个返回 指针 的函数,形参是指向 一维数组的 指针变量和整形变量。从主函数 将 数组名 和 score 和要找的 学生号 k    传递给形参,返回值 是& score[K][0];

    # include

    int main( )

    {

    float score[][4] = {{60,70,80,90},{56,89,67,88},{34,78,90,66}};

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

    float *p;

    int i ,k;

    printf(“enter the number of student:”);

    scanf(“%d”,&k);

    printf(“the score of No.%d are :\n”,k);

    p = search(score ,k);

    for(i = 0,i < 4.i++) printf(“%5.2f\t”,*(p +i));

    printf(“\n”);

    return 0;

    }

    float *search(float(* pointerp[4],int n))

    {

    float *pt;

    pt = *(pointer +n);

    return pt;

    }

    //==============

    int main()

    {

    float score[][4] = {{60,70,80,90},{56,89,67,88},{34,78,90,66}};

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

    int *p;

    int i,j;

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

    {

    p = search(score + i);

    if (p == *(score + i))

    {

    printf(“No.%d score:”,i)

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

    printf(“%5.2f  “,*(p+j))

    }

    }

    return 0;

    }

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

    {

    int i = 0;

    float *pt;

    pt = NULL;

    for(;i < 4;i++)

    if (*(* pointer +i) < 60)  pt = pointer;

    return pt;

    }

    //===============================

    指针数组 和多重指针

    类型名 * 数组名[]

    # include

    # include

    int main( )

    {

    void sort(char *name[ ],int n);

    void print(char *name[ ],int n);

    char * name[ ] = {“Follow me”,”BASIC”,”Great Wall”,”FORTRAN”,”Competer design”};

    // 定义指针数组 ,它的元素 分别 指向5个字符串

    int n = 5;

    sort(name,n);

    print(name,n);

    return 0;

    }

    void sort(char * name[ ],int n)

    {

    char *temp;

    int i,j,k;

    for(i = 0;i < n-1;i++)

    {

    k =i;

    for(j = i +1;j < n;j++) if (strcmp(name[k],name[j]) > 0) k = j;

    if(k != i )

    {

    temp = name[i];name[i] = name[k]; name[k] = temp;

    }

    }

    }

    void print(char *name[ ],int n)

    {

    int i;

    for(i = 0;i < n;i++) printf(“%s”,name[i]);

    }

    相关文章

      网友评论

        本文标题:C语言指针2

        本文链接:https://www.haomeiwen.com/subject/ttvgdxtx.html