C语言编程(十)_c十十编程教学

案例:给函数指针 取个别名

案例:给结构体取个别名

知识点8【结构体指针】

typedef struct stu  
{  
 int num;  
 char name[32];  
 float score;  
}STU,*STU_P;  
//STU就是struct stu的类型 
//STU_P就是struct stu *的类型 
void test04()  
{  
    STU lucy={100, "lucy", 99.9f};  
 //STU_P p=&lucy; 
    STU *p = &lucy;  
 
    printf("num = %d,name=%s,score=%f\n", lucy.num, lucy.name,lucy.score );  
 //*p = *&lucy=lucy 
    printf("num = %d,name=%s,score=%f\n", (*p).num, (*p).name,(*p).score );  
 //直接通过p访问lucy成员 
    printf("num = %d,name=%s,score=%f\n", p->num, p->name, p->score );  
 
 //如果.或->左边 是变量 就用.  如果是地址就用-> 
    printf("num = %d,name=%s,score=%f\n", (&lucy)->num, (&lucy)->name, (&lucy)->score );  
}  

运行结果:

案例:堆区申请结构体空间

知识点9【结构体指针作为函数的参数】

知识点10【函数内部操作外部数组】

typedef struct stu  
{  
 int num;  
 char name[32];  
 float score;  
}STU,*STU_P;  
STU* getSTUArray(int n)  
{  
 return (STU *)calloc(n,sizeof(STU));  
}  
void myInputSTUArray(STU *arr, int n)  
{  
 int i=0;  
 for(;i < n; i++)  
    {  
        printf("请输入第%d个学生的信息:",i+1);  
 //scanf("%d %s %f", &arr[i].num, arr[i].name, &arr[i].score ); 
        scanf("%d %s %f", &(arr+i)->num, (arr+i)->name, &(arr+i)->score );  
    }  
 return;  
}  
void myPrintSTUArray(STU *arr, int n)  
{  
 int i=0;  
 for(i = 0; i < n; i++)  
    {  
       printf("num=%d,name=%s,score=%f\n", (arr+i)->num, (arr+i)->name, (arr+i)->score );  
    }  
 return;  
}  
void test07()  
{  
    STU *arr = NULL;  
 int n = 0;  
    printf("请输入学生的个数:");  
    scanf("%d", &n);  
 
 //根据学生的个数 从堆区申请结构体数组空间 
    arr = getSTUArray(n);  
 
 //获取键盘输入 
    myInputSTUArray(arr, n);  
 
 //遍历结构体数组 
    myPrintSTUArray(arr, n);  
 
 //释放空间 
 if(arr != NULL)  
    {  
        free(arr);  
        arr=NULL;  
    }  
}  
int main(int argc, char const *argv[])  
{  
    test07();  
 return 0;  
} 

运行结果:

知识点11【结构体对齐问题】

步骤:

1、确定分配单位:每一行应该分配的字节数,由结构体中最大的基本类型的大小决定。

2、确定每个成员的起始位置的偏移量 = 成员的基本类型的整数(0~n)倍

3、收尾工作:结构体的总大小 == 分配单位的整数倍。

案例:

结构体嵌套结构体:

typedef struct 
{  
 int x;  
 int y;  
}DATA3;  
typedef struct 
{  
 int a;  
 int b;  
    DATA3 c;//结构体嵌套结构体 
}DATA4;  
void test03()  
{  
 //结构体嵌套结构体:访问到最底层 
    DATA4 data;  
    data.a = 10;  
    data.b = 20;  
    data.c.x = 30;  
    data.c.y = 40;  
    printf("%d\n", data.c.y);  
}

运行结果:

结构体嵌套结构体 的对齐问题

步骤:

1、确定分配单位:每一行应该分配的字节数,由所有结构体中最大的基本类型的大小决定。

2、确定每个成员的起始位置的偏移量 = 成员的基本类型的整数(0~n)倍

结构体成员的偏移量 = 被嵌套的结构体里面最大的基本类型的整数倍

结构体成员中成员偏移量 相对与 被嵌套的结构体

3、收尾工作:结构体的总大小 == 分配单位的整数倍。

结构体成员 的总大小 == 被嵌套的结构体里面最大的基本类型的整数倍

案例:

结构体对齐深思:

知识点11【强制类型对齐】

步骤:

1、确定分配单位:每一行应该分配的字节数,min(value, 默认分配单位)

2、确定每个成员的起始位置的偏移量 = 成员的基本类型的整数(0~n)倍

3、收尾工作:结构体的总大小 == 分配单位的整数倍。

写在最后

在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。

需要完整版PDF学习资源私我

加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值