初识C语言#define、指针、结构体

本文探讨了C/C++中的预处理器宏定义,如何使用#define创建常量和宏,以及指针的概念,包括地址运算和结构体的使用实例。理解指针是内存地址操作的关键,同时通过实际代码展示了结构体的创建和成员访问的不同方式。
摘要由CSDN通过智能技术生成

#define 定义常量和宏

define是一个预处理指令。

在C或C++语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。在C或C++语言中,“宏”分为有参数和无参数两种。

//1.define定义符号
#define MAX 1000
int main()
{
    printf("%d",MAX);//1000
    return 0;
}
//2.define定义宏
#define ADD(X,Y) X+Y
int main()
{
    printf("%d\n",ADD(2,3));//5
    printf("%d\n",4*ADD(2,3));//11  这里有人想为什么不是20
    //实际上它是4*2+3=11
    return 0;
}
//程序运行结果如下图

image-20210406221540786

#define ADD(X,Y) (X+Y)//x,y括起来才能达到想要结果
int main()
{
    printf("%d\n",4*ADD(2,3));//20  只是将2,3的值传给X与Y 4*(2+3)=20
    return 0;
}

程序运行看下图:

image-20210406221820569

指针

指针:是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。

int main()
{
    int a = 10;//a在内存中要分配空间--4个字节
    printf("%p\n", &a);//%p用来打印地址,a的地址取的是a的4个字节的首字节地址
    int* pa = &a;//pa用来存放地址,在C语言中pa叫做指针变量
    //*说明pa是真正变量
    //int 说明pa执行的对象是int类型的

    char ch = 'w';
    char* pc = &ch;
    return 0;
}

image-20210406221412509

这里打印了a的地址

int main()
{
    int a=10;
    int* pa=&a;
    *pa=20;//解引用操作 *pa就是通过pa里面的地址找到a
    printf("%d\n",a);//20
    return 0;
}

指针变量的大小

int main()
{
    printf("%d\n",sizeof(char*))
    printf("%d\n",sizeof(int*))
    printf("%d\n",sizeof(long*))
    printf("%d\n",sizeof(long long*))
    printf("%d\n",sizeof(short*))
    printf("%d\n",sizeof(double*))
     //指针的大小是相同的都是4字节
     // 指针的大小是相同的
     //指针是用来存放地址的
     //指针需要多大空间,取决于地址的储存需要多大空间
     //32位-4字节
     //64位-8字节
    return 0;
}

image-20210406222125812

为什么呢?

首先,我们要明白,指针就是地址,地址就是指针。 而地址是内存单元的编号。所以,一个指针占几个字节,等于是一个地址的内存单元编号有多长。

内存地址就像门牌号,用几位表示需要看门牌数量。
门牌号从0号开始编排,到2^32-1号结束。
一共就有2^32个门牌号。分别为二进制的
000000000000000000000000000号
000000000000000000000000001号
000000000000000000000000010号
最后
111111111111111111111111110号
111111111111111111111111111号
每个门牌的号码是32位(二进制),一个字节为8位,32位就是4字节。64位就是8字节

结构体

结构体是c语言中特别重要的知识点,结构体使得c语言有能力描述复杂类型。结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。结构体和其他类型基础数据类型一样,例如int类型,char类型只不过结构体可以做成你想要的数据类型。以方便日后的使用。在实际项目中,结构体是大量存在的。研发人员常使用结构体来封装一些属性来组成新的类型。由于C语言无法操作数据库,所以在项目中通过对结构体内部变量的操作将大量的数据存储在内存中,以完成对数据的存储和操作。在实际问题中有时候我们需要几种数据类型一起来修饰某个变量。

比如描述学生-名字,年龄,分数

//结构体可以让c语言创建新的类型出来
//创建一个学生
struct Stu
{
    char name[20];
    int age;
    double score;
};
//创建一个书的类型
struct Book
{
    char name[20];
    float price;
    char id[30];
}
int main()
{
    struct Stu s={"张三",20,85.5};//结构体的创建和初始化
    printf("1: %s %d %lf\n",s.name,s.age,s.score);//结构体变量.成员变量
    struct Stu*ps=&s;
    printf("2: %s %d %lf\n",(*ps).name,(*ps).age,(*ps).score);
    
    printf("3: %s %d %lf\n",ps->name,ps->age,ps->score);
    					//结构体指针->成员变量
    return 0;
}

如下图,三种打印成员变量方式打印输出如下

image-20210406223245069

有疑问大家互相交流,欢迎大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小赵小赵福星高照~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值