当前位置:C++技术网 > 资讯 > C语言中一些小问题随写

C语言中一些小问题随写

更新时间:2015-06-26 20:05:52浏览次数:1+次

一、一些复杂类型的读法
int *p  一个指针,指向int型数据
int**p 指向指针的指针,通常与int*p[4] 一起用
int*p[4]  包含4个元素的数组,每个元素是一个指针
int(*p)[4] 指向一个包含4个元素的一维数组的指针
struct Student *p    ( struct Student *)p    结构体指针
double *(double*)  参数为double指针,返回值为double的指针的函数
double(*)()指向函数的指针,函数返回值为double{这个需要从内往外拆,具体方法往后看}

方法:以int (*(*fp)(void *))[10];为例


从内往外拆
    第一步(*fp)(void *)
    这是一个参数为void指针,返回值为一个指针fp的函数,fp指向....
    第二步int (*)[10]
    这是一个指向一维数组的指针
    第三步合体
    这是一个参数为void指针,返回值为一个指针fp的函数,fp指向一个指向一维数组的指针

以下可供领悟参考
1---- int * (*(*)[10]) (void)
p是一个指针,指向一个有10个元素的数组,每个元素为一个指针,指向一个函数,函数参数为void,返回值是int型指针
2-----int ( * ( *x ) [10]) ();
从内往外读,x为一个指针,指向一个包含10个元素的一维数组,数组里每个元素是指针,每个指针指向一个函数,函数参数为空,返回值是int
3------int (*(*fp)(void *))[10];
依旧从内往外读,函数是一个参数为void指针,返回值是一个指针,指针指向另一个指针,这个指针指向一个包含10个元素的int数组
合起来就是
fp是指向{输入void指针,返回指向int[10]首地址指针的函数指针}的指针。
练习,读者尝试读下列两个
int ( * ( *f ) () )[10]; 和 int ( * ( *f ) () )[10];

二、动态链表的建立
例:写一个动态链表,每个单元第一个数据存学号,第二个数据存分数。
谭书程序如下(不太推荐,引入了n读起来有点小费事)

#include <stdio.h>
 #include <stdlib.h>
 #define len sizeof(struct student)
 struct student
 {
     int num;
     float score;
     struct student *next;
 };
 int n;
 struct student *creat(void)
 {
     struct student *head,*p1,*p2;
     n=0;
     p1=p2=(struct student *)malloc(len);
     scanf("%d%f",&p1->num,&p1->score);
     head=NULL;
     while(p1->num!=0)
    {
        n=n+1;
        if(n==1)head=p1;
        else p2->next=p1;
        p2=p1;
        p1=(struct student *)malloc(len);
        scanf("%d%f",&p1->num,&p1->score);
    }
    p2->next=NULL;
    return(head);
}

 int main()
 {
     struct student *pt;
     pt=creat();
     printf("%d\n%f\n",pt->num,pt->score);
     return 0;
 }


自创程序如下

 #include <stdio.h>
 #include <stdlib.h>
 #define len sizeof(struct student)
 struct student
 {
    int num;
    float score;
    struct student *next;
 };
 struct student*creat(void)
 {
    struct student *head,*p1,*p2;
    head=p1=p2=(struct student *)malloc(len);
    scanf("%d%f",&p1->num,&p1->score);
    while(p1->num!=0)
    {
        p1=(struct student *)malloc(len);
        scanf("%d%f",&p1->num,&p1->score);
        p2->next=p1;
        p2=p1;
    }
    p2->next=NULL;
    return(head);
 }
 void main()
 {
    struct student *pt;
    pt=creat();
    printf("%d\n%f\n",pt->num,pt->score);
 }


图解如下(图中程序有错,正确程序如上)

三、指针等基础性的总结以后可能会更新....