c语言—指针高级和宏定义

本文探讨了C语言中指针的高级用法,特别是与结构体数组相结合的应用。重点讲解了结构体数组的数组名其实是一个指向结构体的指针常量,从而帮助读者深化对C语言指针的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.结构体指针
   1)指向结构体的指针
   2)(*p).sex = ‘m’
           p->sex = ‘m’ 
           (*p)对指针的取值后是结构体变量,。sex是访问成员变量
        使用指针可以直接访问结构体成员变量p->sex
    3)练习
/*定义⼀一个点坐标的结构体CPoint,包含两个float 成员x,y 定义两个CPoint结构体变量m,n 使⽤用两个结构体指针分别指向m,n 然后通过指针计算两点距离(提⽰示:1、勾股定理,2、开⽅方函数sqrt)*/
          /*请通过pname成员中的第⼀一个字⺟母改成⼤大写,所有’ ‘(空格)改成下 划线’_’*/#include <stdio.h> #include<stdlib.h> #include <math.h> #include <string.h>
typedef struct student {    int number;    char name [20];    float score;    char gender; }Student; typedef struct cpoint {    float x;    float y;    }CPoint; double juLi(CPoint *p,CPoint *p1) { //    CPoint *p = &cp; //    CPoint *p1 = &cp1;    return  sqrt(((p->x)-(p1->x))*((p->x)-(p1->x))+((p->y)-(p1->y))*((p->y)-(p1->y)));    } double juLi1(CPoint *p,CPoint *p1) {        return  sqrt(((p->x)-(p1->x))*((p->x)-(p1->x))+((p->y)-(p1->y))*((p->y)-(p1->y)));    } void gaiNam(Student *p) {    for (int i = 0 ; i < strlen(p->name); i ++) {        if (i==0) {            p->name[i]-=32;        }        if (p->name[i]==' '&&p->name[i+1]!=' ') {            p->name[i]='_';        }    }    printf("%s\n",p->name); } int main(int argc, const char * argv[]) {    /*请通过pname成员中的第⼀一个字⺟母改成⼤大写,所有’ ‘(空格)改成下 划线’_’*/    Student stu= {1,"lan ou ke ji",78,'F'};    //Student *p = &stu;    gaiNam(&stu);        /*    CPoint cp = {7,6};    CPoint cp1 = {2,8};    double sq = juLi(&cp, &cp1);    double sq1 = juLi1(&cp, &cp1);    printf("%f\t%f\n",sq,sq1);    */                return 0; }

}2.结构体数组的数组名是一个结构体指针常量

3.预编译指令
1)#define
2)#include

宏定义只替换不做运算,所以一般要在宏定义外面加(),以免影响运算的优先级
宏定义行尾不能加分号;
宏定义命名要么大写,要么用驼峰命名法
宏定义命名必须在一行内完成,也不能换行;
宏定义允许嵌套使用
宏定义的结束标识符是#undef  宏名
3.1)#ifdef  标示符
  代码段一
  #else
  代码段二
  #endif
如果 标识符 未被#define 编译器编译代码段1,否则编译代码段2
3.2)#ifndef  标示符
    代码段一
    #else
    代码段二
    #endif
如果 标识符 未被#define 编译器编译代码段1,否则编译代码段2
3.3)#if  常量表达式
    代码段一
    #else
    代码段二
    #endif
如果常量表达式结果⾮非0 编译器编译代码段1,否则编译代码段2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值