C语言笔记-3

这篇博客介绍了C语言中的#define常量定义、宏展开的使用,强调了宏定义时避免逻辑错误的方法。接着讲解了内存、地址的概念,以及如何通过指针访问和修改变量。还探讨了指针的大小以及结构体的创建和使用,展示了如何通过结构体组织复杂的数据。最后,给出了结构体指针的两种访问方式。
摘要由CSDN通过智能技术生成

初识#define 定义常量和宏

define 是一个预处理指令

#define 里被定义的名称必须全大写字母

定义常量

#define MAX 2000

#include<stdio.h>

int main()
{
    int a=MAX+1;
    printf("%d\t%d",MAX,a);

    return 0;
}

给常量名MAX赋予常量2000。

定义宏

#include<stdio.h>
#define ADD(X,Y) X*Y

int main()

{	
    printf("%d", ADD(2, 3));//实际运算2+3
	int a = 4, b = 5;
	printf("\n%d", ADD(a, b));//实际运算4+5

	printf("\n%d", 5 * ADD(2, 3));//实际运算5*2+3
	printf("\n%d", 5 * (ADD(2, 3)));//实际运算5*(2+3)
	printf("\n%d", 5 * ADD_1(2, 3));//因为宏定义时,已经将括号括号了,所以这里也是5*(2+3)

    return 0;
}

为了保证逻辑不出错,建议在定义好的宏左右写上括号:(X+Y)或者((X)+(Y))

初识指针

内存

内存是计算机上非常重要的存储器,计算机中所有的程序都是在内存中运行

为了有效得使用内存,就把内存划分为一个个小得内存单元,每个内存单元大小为1字节 

为了能有效的访问到内存的每一个单元,对内存单元进行编号,这个编号被称为内存单元的地址

地址线通电产生的电信号转换成数字信号,然后形成2进制序列,32位2^32个,64位2^64个

#include<stdio.h>

int main()
{
	int a = 10;
	printf("%p\n", &a);//&是指向地址,这里通过&和%p显示a在内存的地址
	//注意,因为变量有生命周期,每次创建和销毁,他的地址都会改变。
	return 0;
}

指针变量

数据类型 * 指针变量名=&被指向的变量

#include<stdio.h>

int main()
{
	int a = 100;
	int* p_a = &a;
	printf("a=%d\na当前地址:%p\n", a, p_a);
	printf("%p\n", &a);//可以通过&直接访问a的地址
	//注意,因为变量有生命周期,每次创建和销毁,他的地址都会改变。
	*p_a = 20;//通过*p直接访问a,并且重新赋值
	printf("a=%d", a);
	int* p_a_2 = &a;//同时其他指针变量也可以指向a
	*p_a_2 = 30;//同样可以通过*来访问并修改
	printf("\na=%d", a);
	return 0;
}

其中,指针变量p_a也是有地址来存放的,

所以这里p_a=&a,其实就是在p_a的内存空间里存放a的开头地址。

指针变量可以通过*来直接访问被指向变量的值,*p_a其实就是a。

一个变量的地址,可以有多个指针变量指向它。

指针的大小

运用sizeof同样可以得到指针类型的大小

#include<stdio.h>

int main()
{
	printf("%d\n", sizeof(int*));
	printf("%d\n", sizeof(char*));
	printf("%d\n", sizeof(short*));
	printf("%d\n", sizeof(long*));
	printf("%d\n", sizeof(long long*));
	printf("%d\n", sizeof(float*));
	printf("%d\n", sizeof(double*));
	return 0;

}

所有位数都一致,因为指针是存放地址,而地址有多大,指针就有多大。

不同位数下,得到结果不一样,32位得到的是4,64位得到的是8

初识结构体

结构体有助于让我们描述复杂对象类型

结构体,可以让c语言创建一个新的类型出来

#include<stdio.h>
//
struct stu
{
	char name[20];
	int age;
	long id;
	char sex[3];
};
int main()
{
	struct stu s_1 = { "李华",19,2020211666,"男" };
	printf("%s	%d	%d	%s", s_1.name, s_1.age, s_1.id, s_1.sex);
	struct stu s_2 = { "莉莉",32,1988211666,"女" };
	struct stu* p_s = &s_2;//结构指针
	printf("\n%s	%d	%d	%s", (*p_s).name, (*p_s).age, (*p_s).id, (*p_s).sex);
	printf("\n%s	%d	%d	%s", p_s->name, p_s->age, p_s->id, p_s->sex);
	//调用结构指针,有两种方法,一种是(指针变量).结构成员变量
	//另一种是结构体指针->结构成员变量名
	return 0;
}

上述代码中,我们通过struct创建了一个stu结构体,其具有四种属性(成员变量):name,age,id,sex。

后面又使用struct stu 类型声明了一个s_1对象,并对该对象的属性赋值。

初识篇章结束,下周开始提速学习!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值